DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 75: Inclua as informações a respeito das capturas de falhas nos detalhes da mensagem

Recomendações principais
Detalhe a falha nas mensagens de exceção:

  • Inclua valores de parâmetros e campos que contribuíram para a falha.
  • Use mensagens concisas e informativas para ajudar na análise.
  • Exemplo: Para uma IndexOutOfBoundsException, inclua:
throw new IndexOutOfBoundsException("Index: " + index + ", Lower bound: " + lowerBound + ", Upper bound: " + upperBound);

Enter fullscreen mode Exit fullscreen mode

Evite incluir dados sensíveis:

  • Nunca exponha senhas, chaves de criptografia ou informações sensíveis em mensagens detalhadas, pois rastreamentos de pilha podem ser visualizados por várias pessoas.

Priorize conteúdo sobre legibilidade:

  • A mensagem detalhada deve ser voltada para desenvolvedores e engenheiros, auxiliando na análise de falhas.
  • Mensagens para usuários finais devem ser separadas e amigáveis, com localização se necessário.

Benefícios de Construtores específicos

  • Construtores específicos para exceções ajudam a capturar informações relevantes e gerar mensagens automaticamente.
  • Reduzem erros e garantem consistência na captura de falhas.
  • Exemplo de construtor ideal:
public class IndexOutOfBoundsException extends RuntimeException {
    private final int lowerBound;
    private final int upperBound;
    private final int index;

    public IndexOutOfBoundsException(int lowerBound, int upperBound, int index) {
        super("Index: " + index + ", Lower bound: " + lowerBound + ", Upper bound: " + upperBound);
        this.lowerBound = lowerBound;
        this.upperBound = upperBound;
        this.index = index;
    }

    public int getLowerBound() {
        return lowerBound;
    }

    public int getUpperBound() {
        return upperBound;
    }

    public int getIndex() {
        return index;
    }
}

Enter fullscreen mode Exit fullscreen mode

Inclua métodos de acesso aos detalhes da falha

  • Para exceções verificadas, os métodos de acesso (getters) podem facilitar a recuperação e análise.
  • Mesmo para exceções não verificadas, é recomendável fornecer getters quando apropriado.

Práticas recomendadas

  • Centralize a lógica da mensagem na classe de exceção:
  • Evite replicar a lógica de geração da mensagem detalhada em múltiplos pontos do código.
  • Exemplo com geração centralizada de mensagem:
public class DivisionByZeroException extends ArithmeticException {
    private final int numerator;

    public DivisionByZeroException(int numerator) {
        super("Attempted to divide " + numerator + " by zero.");
        this.numerator = numerator;
    }

    public int getNumerator() {
        return numerator;
    }
}

Enter fullscreen mode Exit fullscreen mode

Casos reais
Exemplo com IndexOutOfBoundsException (Java 9+):

public IndexOutOfBoundsException(int index) {
    super("Index out of range: " + index);
}

Enter fullscreen mode Exit fullscreen mode

Exemplo de uma classe personalizada:

public class InvalidConfigurationException extends RuntimeException {
    private final String configKey;

    public InvalidConfigurationException(String configKey) {
        super("Invalid configuration for key: " + configKey);
        this.configKey = configKey;
    }

    public String getConfigKey() {
        return configKey;
    }
}

Enter fullscreen mode Exit fullscreen mode

Conclusão

  • Sempre inclua informações relevantes de falhas nas mensagens de exceções, evitando dados sensíveis.
  • Utilize construtores específicos e métodos de acesso para capturar e documentar informações críticas.
  • Essas práticas aumentam a confiabilidade e facilitam a depuração e manutenção do código.

Exemplo do livro:
Image description

Top comments (0)