ConstructiCat Logo
CodeBust.
Browse section ▾

Substituir Exceção por Teste.

Problem

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

Solution

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

##Example

Before
double getValueForPeriod(int periodNumber) {
  try {
    return values[periodNumber];
  } catch (ArrayIndexOutOfBoundsException e) {
    return 0;
  }
}
After
double getValueForPeriod(int periodNumber) {
  if (periodNumber >= values.length) {
    return 0;
  }
  return values[periodNumber];
}

##Why Refactor

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.

##Benefits

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

##How to Refactor

  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.