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?
java
logging
pmd
printstacktrace
user1305398
fonte
fonte
Respostas:
Isso significa que você deve usar uma estrutura de registro como logback ou log4j e em vez de imprimir as exceções diretamente:
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.
fonte
Se você chamar
printStackTrace()
uma exceção, o rastreamento será gravadoSystem.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 exemplologger.error("some exception message", e)
).Isso permite que você:
fonte
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.)
fonte
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.
fonte
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.
fonte
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 ()fonte
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.
fonte