在我的应用程序中,我正在通过PMD运行我的代码。它向我显示了这条消息:
- 避免使用printStackTrace();请使用记录器调用。
这是什么意思?
答案 0 :(得分:106)
这意味着您应该使用logback或log4j等日志框架,而不是直接打印例外:
e.printStackTrace();
你应该使用这个框架的API来记录它们:
log.error("Ops!", e);
日志框架为您提供了很大的灵活性,例如:您可以选择是否要登录到控制台或文件 - 或者如果您发现某些消息在某些环境中不再相关,则可以跳过这些消息。
答案 1 :(得分:34)
如果您在异常时调用printStackTrace()
,则会将跟踪写入System.err
并且很难将其路由到其他地方(或过滤它)。而不是这样做,建议您使用日志框架(或围绕多个日志框架的包装器,如Apache Commons Logging),并使用该框架记录异常(例如logger.error("some exception message", e)
)。
这样做可以让你:
答案 2 :(得分:16)
生产质量计划应使用众多日志备选方案之一(例如log4j,logback,java.util.logging)来报告错误和其他诊断。这有许多优点:
相比之下,如果您只使用printStackTrace,则部署者/最终用户几乎没有控制权,并且在不适当的情况下,日志消息可能会丢失或显示给最终用户。 (并且没有什么比一个随机的堆栈跟踪更害怕胆小的用户。)
答案 3 :(得分:4)
在Simple中,e.printStackTrace()不是好习惯,因为它只是将堆栈跟踪打印到标准错误。因此,您无法真正控制此输出的位置。
答案 4 :(得分:1)
几乎每个日志框架都提供了一种方法,我们可以在其中传递throwable对象和消息。像:
public trace(Marker marker, String msg, Throwable t);
他们打印throwable对象的stacktrace。
答案 5 :(得分:0)
让我们从公司概念入手。日志为您提供了灵活的级别(请参见Difference between logger.info and logger.debug)。不同的人希望看到不同的级别,例如QA,开发人员,业务人员。但是e.printStackTrace()会打印出所有内容。同样,就像将调用该方法一样,该错误可能会打印多次。然后,您公司中的Devops或Tech-Ops人员可能会发疯,因为他们将收到相同的错误提示。
我认为更好的替代方法可能是log.error("errors happend in XXX", e)
与e.printStackTrace()
答案 6 :(得分:-1)
主要原因是Proguard将从生产中删除Log调用。因为通过登录或打印StackTrace,可以通过例如Logcat Reader应用程序在Android手机中查看它们(堆栈跟踪或Log中的信息)。因此,这对于安全性而言是一种不良做法。另外,我们在生产期间不访问它们,最好将其从生产中删除。由于ProGuard会删除所有不是stackTrace的Log调用,因此最好使用Log in catch代码块,然后由Proguard将其从Production中删除。