sexta-feira, 6 de dezembro de 2013

Captura e Ignora - Antipattern de exceção

Em qualquer sistema, as exceções sempre irão existir, e por motivos diversos:
  • a importação de um arquivo com um dado não esperado, 
  • uma sobrecarga no sistema que provocou um timeout em uma operação, 
  • uma tabela que esqueceram de atualizar no banco, 
  • o disco que encheu, 
  • um arquivo com permissão de somente-leitura,
  • um possível bug,
  • etc etc etc.
Estas ações são indesejáveis e, por mais exaustivamente que se teste o sistema, você nunca terá a garantia que estará livre dos problemas acima. Você dificilmente conseguirá sempre realizar testes para todas estas condições e tantas outras não listadas.
Mas o que temos que fazer afinal?
Tratar a exceção da melhor maneira possível, informando a exceção com precisão no log, e passando uma mensagem precisa ao usuário. Mas as vezes encontramos exatamente o contrário, trechos de código que captura a exceção, e segue em frente como se nada tivesse acontecido.
Não faça isso com sua exceção
Abaixo estão alguns exemplos do que NÃO se deve fazer:
catch (IOException e) {
  return null;
}
Ou
catch (IOException e) { }
Com isso, além de simplesmente retornar nulo (ou não fazer nada), ao invés de manipula-la, ou relançar a exceção, você joga fora de vez qualquer informação referente ao problema que gerou a exceção.
Outras maneiras de esconder a exceção:
catch (IOException e) {
    log.error("Erro", e);
    return null;
}
Ou
catch (IOException e) {
    e.printStackTrace();
    return null;
}
Ou

catch (IOException e) {
    e.printStackTrace(); // Ou log.error("Erro", e);
}
De maneira similar as situações anteriores, a única diferença é que a exceção, pelo menos, foi logada, mas o fluxo de execução continua normalmente. Isto nem sempre está errado, mas muitas vezes o programador não insere este código nos pontos apropriados. Ao invés de retornar nulo ou seguir com o fluxo de execução, a exceção deveria ser tratada.

Nenhum comentário:

Postar um comentário