Logotipo do ConstructiCat
CodeBust.
Explorar a seção ▾

Substituir Código de Erro por Exceção.

Problema

Um método retorna um valor especial que indica um erro?

Solução

Em vez disso, lance uma exceção.

##Exemplo

Antes
int withdraw(int amount) {
  if (amount > balance) {
    return -1;
  }
  else {
    balance -= amount;
    return 0;
  }
}
Depois
void withdraw(int amount) throws BalanceException {
  if (amount > balance) {
    throw new BalanceException();
  }
  balance -= amount;
}

##Por que refatorar

Retornar códigos de erro é um resquício obsoleto da programação procedural. Na programação moderna, o tratamento de erros é feito por classes especiais, chamadas de exceções. Se ocorre um problema, você “lança” um erro, que então é “capturado” por um dos tratadores de exceção. Um código especial de tratamento de erros, que é ignorado em condições normais, é ativado para responder.

##Benefícios

  • Livra o código de um grande número de condicionais para verificar diversos códigos de erro. Os tratadores de exceção são uma forma muito mais concisa de diferenciar os caminhos de execução normais dos anormais.

  • As classes de exceção podem implementar seus próprios métodos, contendo assim parte da funcionalidade de tratamento de erros (como o envio de mensagens de erro).

  • Ao contrário das exceções, os códigos de erro não podem ser usados em um construtor, já que um construtor deve retornar apenas um novo objeto.

##Como refatorar

Procure executar esses passos de refatoração para apenas um código de erro de cada vez. Isso facilitará manter todas as informações importantes na cabeça e evitar erros.

  1. Encontre todas as chamadas a um método que retorna códigos de erro e, em vez de verificar um código de erro, envolva-as em blocos try/catch.

  2. Dentro do método, em vez de retornar um código de erro, lance uma exceção.

  3. Altere a assinatura do método para que contenha informações sobre a exceção que está sendo lançada (seção @throws).