避免printStackTrace(); 改用logging器调用
在我的应用程序中,我通过PMD运行我的代码。它向我显示了这条消息:
- 避免printStackTrace(); 改用logging器调用。
那是什么意思?
这意味着您应该使用logback或log4j等日志框架,而不是直接打印exception:
e.printStackTrace();
你应该使用这个框架的API来logging它们:
log.error("Ops!", e);
日志框架为您提供了很大的灵活性,例如,您可以select是否要login到控制台或文件 – 或者如果在某些环境中发现它们不再相关,则可能会跳过一些消息。
如果对exception调用printStackTrace()
,则跟踪将写入System.err
,并且很难将其路由到其他位置(或者对其进行过滤)。 不要这样做,build议使用日志框架(或多个日志框架的包装,如Apache Commons Logging),并使用该框架loggingexception(例如logger.error("some exception message", e)
)。
这样做可以让您:
- 将日志语句一次写入不同的位置,例如控制台和文件
- 根据严重性(错误,警告,信息,debugging等)和来源(通常是包或基于类)过滤日志语句,
- 对日志格式有一些影响,而不必更改代码
- 等等
生产质量程序应使用许多日志logging替代方法之一(例如log4j,logback,java.util.logging)来报告错误和其他诊断。 这具有许多优点:
- 日志消息转到可configuration的位置。
- 除非您configuration日志logging,否则最终用户不会看到这些消息。
- 您可以使用不同的logging器和logging级别等来控制logging多less或多lesslogging。
- 您可以使用不同的appender格式来控制日志的外观。
- 您可以轻松地将日志logging输出插入到更大的监视/日志logging框架中。
- 以上所有都可以在不改变你的代码的情况下完成; 即通过编辑已部署的应用程序的日志configuration文件。
相比之下,如果您只是使用printStackTrace,则部署者/最终用户几乎没有任何控制权,并且日志消息可能会在不适当的情况下丢失或显示给最终用户。 (没有什么比一个随机堆栈跟踪更害怕一个胆小的用户。)
几乎每个日志logging框架都提供了一个方法,在该方法中,我们可以将可抛出的对象与消息一起传递。
比如:public trace(Marker marker,String msg,Throwable t);
他们打印可抛物体的堆栈跟踪。
简单地说,e.printStackTrace()不是好的做法,因为它只是将堆栈跟踪打印到标准错误。 正因为如此,你不能真正控制这个输出的位置。