Tenho um arquivo DAO, que tenho vários métodos para fazer consulta, insert, update e delete, de classes de entidades genéricas, o que funciona perfeitamente.
Alguns momentos retornam exceções de bancos que não foram tratadas. Qual é a melhor maneira de se fazer isto, tendo em vista que pode se conectar a qualquer banco de dados relacional.
Todos os métodos desta classe tem o throws Exception.
O ideal é não poluir o código com um bando de try catch sem função pro usuário.
Pode usar por exemplo o log4j:
https://imasters.com.br/back-end/usando-log4j-em-projetos-java
Ou similar, não sei qual o mais usado hoje para Java.
Obrigado @javaflex.
Mas eu utilizo o log4j, sim. Mas o que quero dizer é.
Exemplo: existe um campo obrigatório ou um campo único que não foi tratado em regra de negócios. Se ele tiver vazio ou for único o banco retorna uma exceção, assim cada banco de dados retorna esta mensagem de um jeito.
Este retorno que estou falando, qual é a melhor maneira de tratar ela ?
Ou qualquer mensagem de exceção que vem do bando de dados.
Conseguiu entender ?
Isso é regra de negócio, você deve criar uma validação no seu sistema e não deixar estourar uma exception do banco.
Em Java se nao me engano se usa mais bean validation.
Sei que é regra de negócio. Mas se o programador esquecer, como fazer ?
O sistema vai retorna o erro em inglês ?
Voce faz o tratamento das exceçoes no try catch , não vai aparecer nada em ingles
Ex:
public static Connection getConexao() {
try {
if ( c == null )
{
Class.forName(DRIVER);
c = DriverManager.getConnection(URL, USUARIO, SENHA);
System.out.println("Conexao OK");
}
} catch (ClassNotFoundException e) {
//JOptionPane.showMessageDialog(null,"Problemas na conexao\n"+e);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,"Problemas na conexao\n"+e);
}
return c;
}
}
Essa é nova! Se esquecer é bug. Tem que ir pro log do log4j e redirecionar pra uma página de erro padrão informando que aconteceu um erro, sem especificar o erro. Muitos frameworks possuem evento ou configuração centralizada pra você fazer esse redirect, sem precisar espalhar try catch pelo código.
Faz o levantamento das regras de negócio antes de programar.
Se estiver a usar Spring, por exemplo, podes definir um RestAdvisor com base em qualquer tipo de exceção. Desta forma, se o programador esquecer de tratar o erro, a camada de controle de exceções do Spring cuida do assunto.
Se realmente o Spring for a tecnologia do projeto, avisa!
Mas uma coisa é certa, se a aplicação demandar e o programador “esquecer”, certamente é um bug da aplicação
Se não usar o Spring, acredito que podes pensar nesse conceito de interceptor nas suas chamadas.
É Spring.
Mas uma coisa é certa, se a aplicação demandar e o programador “esquecer”, certamente é um bug da aplicação
Sim, eu sei.
Se estiver a usar Spring, por exemplo, podes definir um RestAdvisor com base em qualquer tipo de exceção. Desta forma, se o programador esquecer de tratar o erro, a camada de controle de exceções do Spring cuida do assunto.
Como tratar ?
Exemplo bem simples pode ser feito assim:
@RestControllerAdvice
class Advisor extends ResponseEntityExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NotFoundException.class)
public void someErrorWillBeCatched(){
}
}
@RestControllerAdvice define que a classe será um interceptor dos controllers
@ExceptionHandler define o hook pra executar o método com base no tipo da exceção. Aqui tu podes criar uma exceção que represente o tal erro do banco e toda vez que a exceção for lançada, o método marcado será executado.
ResponseEntityExceptionHandler é uma classe que te dá algumas opções interessantes de manipulação.
Obrigado.
Vou tentar desenvolver aqui e falo o resultado.