Gostaria de saber da experiência e da opinião de vocês a respeito da maneira como lidam com exceções nas suas aplicações.
Em um projeto recente defini duas formas de tratar as exceções da aplicação, uma baseada em (checked) Exception e outra em RuntimeException, direta ou indiretamente.
Todas as exceções de negócio ou que demandam tratamento esperado deveria ser subclasse de Exception.
As exceções técnicas ou inesperadas seriam subclasse de RuntimeException.
Exemplos:
Exceção de negócio (checked)
public void cadastrarFornecedor( Fornecedor f ) throws ValidacaoException {
if( !validaCnpj( f.getCnpj() ) ) {
throw new CNPJInvalidoException( f.getCnpj() );
}
}
Exceção inesperada
public Fornecedor buscarFonecedor( String cnpj ) {
try {
// faz a busca do fornecedor pelo CNPJ via JPA
} catch( Exception e ) {
throw new DAOException(e);
}
}
Em um ponto centralizado do sistema eu trato as exceções inesperadas, fazendo logging e exibindo página de erro.
Se o caso de uso prevê tratamento específico em caso de erro técnico/inesperado, isso é feito no código mesmo:
public void consolidarInformacoes() {
fazerCalculos();
salvarAlgunsDados();
try {
atualizarInfoFornecedores();
} catch( RuntimeException e ) {
// nao preciso fazer rollback, apenas logging
log.warn(e);
}
consiladacaoFinal();
}
Ou seja, no código acima eu teria uma transação completa, mas o fato do método atualizarInfoFornecedores() lançar alguma exceção, não compromete o processo todo.
E ai, como costumam fazer?