Problema:
- Métodos que propagam diretamente exceções de camadas inferiores podem:
- Poluir a API da camada superior com detalhes de implementação.
- Quebrar a compatibilidade caso as exceções mudem em versões futuras.
Soluções:
Tradução de Exceções:
- Capture a exceção de nível inferior e lance outra mais adequada para a abstração de nível superior.
Exemplo:
try {
// Operação em nível inferior
someLowerLevelOperation();
} catch (LowerLevelException e) {
// Tradução da exceção
throw new HigherLevelException("Erro na operação de alto nível", e);
}
Encadeamento de Exceções:
- A exceção de nível inferior pode ser passada como "causa" para a de nível superior.
- Permite depuração, pois mantém a causa original disponível.
Exemplo:
class HigherLevelException extends Exception {
public HigherLevelException(String message, Throwable cause) {
super(message, cause);
}
}
try {
someLowerLevelOperation();
} catch (LowerLevelException e) {
throw new HigherLevelException("Erro ao processar a operação", e);
}
Evitar exceções quando possível:
- Valide os parâmetros antes de passá-los para camadas inferiores.
Exemplo:
public void higherLevelMethod(String input) {
if (input == null || input.isEmpty()) {
throw new IllegalArgumentException("Input inválido");
}
// Chamada ao método de nível inferior
lowerLevelMethod(input);
}
Isolar o chamador do erro:
- A camada superior pode tentar contornar a exceção silenciosamente.
- Use logs para registrar os problemas
try {
someLowerLevelOperation();
} catch (LowerLevelException e) {
Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erro capturado", e);
// Continue sem lançar a exceção
}
Boas Práticas:
- Use tradução de exceções apenas quando necessário.
- Prefira evitar exceções de camadas inferiores ou tratar as exceções silenciosamente.
- Utilize o encadeamento para manter informações úteis sobre a exceção original.
Resumo de Implementação:
Tradução de exceções:
try {
operation();
} catch (IOException e) {
throw new CustomException("Erro específico", e);
}
Encadeamento com initCause (para exceções sem suporte direto ao encadeamento):
CustomException customException = new CustomException("Erro específico");
customException.initCause(originalException);
throw customException;
Logging de exceções para depuração:
try {
someLowerLevelOperation();
} catch (Exception e) {
Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Erro ao executar operação", e);
}
Quando evitar tradução de exceções:
Se a exceção de camada inferior já for adequada para a camada superior.
Exemplo:
try {
operation();
} catch (IllegalArgumentException e) {
throw e; // Repassa diretamente, pois já é adequada
}
Top comments (0)