[quote=Bruno Laturner]
O Sérgio também tem vários artigos:
Exceções: Conceitos
Exceções: Boas práticas, más práticas
Exceções: Classe Utilitárias
Li um pouco na parte de Boas práticas, em Camadas e exceções
Bem, é a regra de que cada camada sabe tratar o que vem de baixo, seja retorno ou exceção, enquanto a que está em baixo nem sabe que a de cima existe, então mesmo junto com essas novas regras de un/checked exceptions que outros frameworks usam, parece que tem q tratar tudo. Ou pelo menos transformar mesmo.[/quote]
Em inglês existe o termo “handle” (manipular) que é diferente de resolver.
Quando uma camada recebe uma exceção da camada inferior que ela não sabe resolver, mesmo assim ela têm que a manipular (handle). Em bom protugues, ela tem que fazer o try-catch. Mas isso apenas para a encapsular em uma outra Exceção da própria camada.
Por exemplo, quando vc comunica com o banco de dados via jdbc a exceção que é retornada é SQLException, sempre. Mesmo quando o erro é um IOException ( por exemplo, connectino timeout).
A dificuldade do encapsulamento advém do fato que simplesmente jogar todas as exceções das camadas inferirors no mesmo bolo não ajuda nada. ( por exemplo um SQLException de “sem conexão” deveria ser um exception de uma classe filha de SQLException). Seguindo a boa prática “Seja especifico” vc deve encapsular as exceções mais baixas em exceções da camada mas de forma categorizada. Todas elas herdam da exceção “mãe” da camada mas são mais especificas.
Por exemplo, numa camada de acesso a dados genérica poderíamos ter a exceção mae “DataAcessException” e como filhas poderíamos ter “ConnectionException” , “DatabaseNotFoundException” , “AutenticationException” , “DuplicateRegistryException” e “ConcurrencyException”. Todas elas são DataAcessException, mas todas significam erros de categorias diferentes.
finalmente as classe de exceção mãe deve ser filha de RuntimeException. Apenas deve ser filha de Exception se a camada representa algum subsistema fora do escopo da aplicação. ( por exemplo IOException é checked porque representa o o subsistema de arquivos do OS e a SQLException o subsistema de banco de dados)