Arquivo DAO

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 :slight_smile:

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 :slight_smile:

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.