DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 73: Lance exceções adequadas para a abstração

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);
}

Enter fullscreen mode Exit fullscreen mode

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);
}

Enter fullscreen mode Exit fullscreen mode

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);
}

Enter fullscreen mode Exit fullscreen mode

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
}

Enter fullscreen mode Exit fullscreen mode

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);
}

Enter fullscreen mode Exit fullscreen mode

Encadeamento com initCause (para exceções sem suporte direto ao encadeamento):

CustomException customException = new CustomException("Erro específico");
customException.initCause(originalException);
throw customException;

Enter fullscreen mode Exit fullscreen mode

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);
}

Enter fullscreen mode Exit fullscreen mode

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
}

Enter fullscreen mode Exit fullscreen mode

Exemplos do livro:
Image description

--
Image description

--
Image description

--
Image description

Top comments (0)