Em meu aplicativo, estou executando meu código por meio de PMD. Ele me mostra esta mensagem:
- Evite printStackTrace (); em vez disso, use uma chamada de logger.
O que isso significa?
Em meu aplicativo, estou executando meu código por meio de PMD. Ele me mostra esta mensagem:
- Evite printStackTrace (); em vez disso, use uma chamada de logger.
O que isso significa?
Respostas:
Isso significa que você deve usar uma estrutura de registro como logback ou log4j 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.
Se você chamar printStackTrace()
uma exceção, o rastreamento será gravado System.err
e 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ê:
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:
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.)
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.
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 ()
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.