ConstructiCat Logo
CodeBust.
Browse section ▾

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

Problem

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

Solution

Em vez disso, lance uma exceção.

##Example

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

##Why Refactor

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.

##Benefits

  • 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.

##How to Refactor

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).