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

Substituir Exceção por Teste.

Problema

Você lança uma exceção em um lugar onde um teste simples faria o trabalho?

Solução

Substitua a exceção por um teste de condição.

##Exemplo

Antes
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
Depois
double getValueForPeriod(int periodNumber) {
  if (periodNumber < 0 || periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##Por que refatorar

As exceções devem ser usadas para tratar comportamentos irregulares relacionados a um erro inesperado. Elas não devem servir como substituto para testes. Se uma exceção pode ser evitada simplesmente verificando uma condição antes da execução, então faça isso. As exceções devem ser reservadas para erros reais.

Por exemplo, você entrou em um campo minado e acionou uma mina ali, resultando em uma exceção; a exceção foi tratada com sucesso e você foi lançado pelos ares até a segurança, para além do campo minado. Mas você poderia ter evitado tudo isso simplesmente lendo, para começar, a placa de aviso em frente ao campo minado.

##Benefícios

  • Uma condicional simples às vezes pode ser mais óbvia do que código de tratamento de exceções.

##Como refatorar

  1. Crie uma condicional para um caso de borda e mova-a para antes do bloco try/catch.

  2. Mova o código da seção catch para dentro dessa condicional.

  3. Na seção catch, coloque o código para lançar uma exceção comum, sem nome, e execute todos os testes.

  4. Se nenhuma exceção foi lançada durante os testes, livre-se do operador try/catch.