Item 73: Lance exceções adequadas para a abstração
Java Efetivo (livro)
Posted on November 28, 2024
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
}
💖 💪 🙅 🚩
Java Efetivo (livro)
Posted on November 28, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
career Burnout, Imposter Syndrome & More: What Junior Devs Really Experience 🕵️♀️
November 28, 2024
webdev Mastering the Dependency Inversion Principle: Best Practices for Clean Code with DI
November 28, 2024