Evite printStackTrace (); use uma chamada de logger em vez disso

Respostas:

137

Isso significa que você deve usar uma estrutura de registro como ou e em vez de imprimir as exceções diretamente:

e.printStackTrace();

você deve registrá-los usando a API deste framework:

log.error("Ops!", e);

As estruturas de registro oferecem muita flexibilidade, por exemplo, você pode escolher se deseja registrar no console ou arquivo - ou talvez pular algumas mensagens se não as considerar mais relevantes em algum ambiente.

Tomasz Nurkiewicz
fonte
39

Se você chamar printStackTrace()uma exceção, o rastreamento será gravado System.erre será difícil encaminhá-lo para outro lugar (ou filtrá-lo). Em vez de fazer isso, é recomendado usar uma estrutura de registro (ou um wrapper em torno de várias estruturas de registro, como Apache Commons Logging) e registrar a exceção usando essa estrutura (por exemplo logger.error("some exception message", e)).

Isso permite que você:

  • escrever a declaração de log em diferentes locais ao mesmo tempo, por exemplo, o console e um arquivo
  • filtrar as declarações de log por gravidade (erro, aviso, informações, depuração etc.) e origem (normalmente com base em pacote ou classe)
  • tem alguma influência no formato do log sem ter que mudar o código
  • etc.
Thomas
fonte
17

Um programa de qualidade de produção deve usar uma das muitas alternativas de registro (por exemplo, log4j, logback, java.util.logging) para relatar erros e outros diagnósticos. Isso tem uma série de vantagens:

  • As mensagens de log vão para um local configurável.
  • O usuário final não vê as mensagens, a menos que você configure o registro para que ele / ela as veja.
  • Você pode usar diferentes registradores e níveis de registro, etc. para controlar quanto pouco ou muito registro é registrado.
  • Você pode usar diferentes formatos de appender para controlar a aparência do registro.
  • Você pode facilmente conectar a saída de registro em uma estrutura de monitoramento / registro maior.
  • Todas as opções acima podem ser feitas sem alterar seu código; ou seja, editando o arquivo de configuração de registro do aplicativo implantado.

Por outro lado, se você usar apenas printStackTrace, o implantador / usuário final tem pouco ou nenhum controle e as mensagens de registro podem ser perdidas ou mostradas ao usuário final em circunstâncias inadequadas. (E nada apavora mais um usuário tímido do que um rastreamento de pilha aleatório.)

Stephen C
fonte
5

No Simple, e.printStackTrace () não é uma boa prática, porque apenas imprime o rastreamento de pilha para o erro padrão. Por causa disso, você não pode realmente controlar para onde vai essa saída.

Sandip S.
fonte
0

Quase toda estrutura de registro fornece um método no qual podemos passar o objeto que pode ser jogado junto com uma mensagem. Gostar:

public trace(Marker marker, String msg, Throwable t);

Eles imprimem o rastreamento de pilha do objeto que pode ser jogado.

abhi shukla
fonte
Isso não responde à pergunta.
Stephen C
-1

Vamos falar do conceito de empresa. O log oferece níveis flexíveis (consulte Diferença entre logger.info e logger.debug ). Pessoas diferentes querem ver níveis diferentes, como QAs, desenvolvedores, executivos. Mas e.printStackTrace () imprimirá tudo. Além disso, como se esse método fosse chamado restful, esse mesmo erro pode ser impresso várias vezes. Então, o pessoal de Devops ou Tech-Ops em sua empresa pode ficar louco porque receberá os mesmos lembretes de erro. Acho que uma substituição melhor poderia ser. log.error("errors happend in XXX", e) Isso também imprimirá informações inteiras que são de fácil leitura do que e.printStackTrace ()

Qiyu Zhang
fonte
-3

O principal motivo é que o Proguard removeria as chamadas de registro da produção. Porque ao registrar ou imprimir o StackTrace, é possível vê-los (informações dentro do stack trace ou Log) dentro do telefone Android, por exemplo, o aplicativo Logcat Reader. Portanto, é uma má prática de segurança. Além disso, não os acessamos durante a produção, seria melhor retirá-los da produção. Como o ProGuard remove todas as chamadas de Log, não o stackTrace, por isso é melhor usar Log em blocos de captura e deixá-los removidos da produção por Proguard.

Amirhossein Hashemi
fonte