避免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()不是好的做法,因为它只是将堆栈跟踪打印到标准错误。 正因为如此,你不能真正控制这个输出的位置。