在我的应用程序中,我正在通过PMD运行我的代码,它向我显示以下消息:
- 避免使用printStackTrace(); 请改用记录器调用。
那是什么意思?
Answers:
生产质量程序应使用许多日志记录替代方法(例如log4j,logback,java.util.logging)之一来报告错误和其他诊断信息。这具有许多优点:
相比之下,如果仅使用printStackTrace,则部署者/最终用户几乎没有控制权,并且在不适当的情况下,日志消息很容易丢失或显示给最终用户。(没有什么比随机堆栈跟踪更让胆小的用户感到恐惧了。)
让我们从公司概念谈起。日志为您提供了灵活的级别(请参阅logger.info和logger.debug之间的区别)。不同的人希望看到不同的级别,例如QA,开发人员,业务人员。但是e.printStackTrace()会打印出所有内容。同样,就像将调用该方法一样,该错误可能会打印多次。然后,公司中的Devops或Tech-Ops人员可能会发疯,因为他们将收到相同的错误提示。我认为可能是更好的替代方法,log.error("errors happend in XXX", e)
这还将打印出比e.printStackTrace()更易于阅读的全部信息。
主要原因是Proguard将从生产中删除Log调用。因为通过登录或打印StackTrace,可以通过例如Logcat Reader应用程序在Android手机中查看它们(堆栈跟踪或Log中的信息)。因此,这对于安全性而言是一种不良做法。此外,我们在生产期间不访问它们,最好将其从生产中删除。由于ProGuard删除了所有不是stackTrace的Log调用,因此最好使用Log in catch块,并让它们由Proguard从Production中删除。