我们应该记录托管异常的堆栈跟踪吗?

时间:2014-12-03 18:22:40

标签: java logging printstacktrace

我在没有找到真正答案的情况下对这个问题做了很多研究。

尝试想象一个执行多线程调用Callable的程序。 为此,我们启动一个具有特定超时的ExecutorService,它会调用所有进程。

所以我们有一个try ... catch块有多个例外:

  • 取消超时暂停
  • 如果在线程
  • 中引发异常,则执行异常
  • InterruptedException for a stop stop ...

哲学是仅记录消息,还是记录消息和throwable(所以堆栈跟踪)?

总结一下,我们应该这样做:

} catch (CancellationException ce) {
    logger.error("Timeout. Process cancelled", ce);
}

或只是记录消息错误?

堆栈跟踪是否仅被视为出现错误?

谢谢。

1 个答案:

答案 0 :(得分:0)

对于编码,您应该坚持使用以下模式:

} catch (CancellationException ce) {
    logger.error("Timeout. Process cancelled", ce);
}

原因是Throwable捕获了错误的完整上下文。如果您从记录器中省略了该上下文的一部分,那么如果需要,您将无法在以后访问它。甚至包含在Java中的Throwable类也会随着时间的推移而被修改,以包含链接和抑制异常等内容。因此,即使您只想要来自此throwable的消息,您仍然可能希望查看抑制异常和异常原因的完整堆栈跟踪。

在输出端,我认为你可以证明,对于某些例外,堆栈跟踪并不重要。在某些情况下,目标受众不得或不希望看到异常堆栈跟踪。对于这些情况,应利用框架的功能来更改已发布的输出以满足目标受众。如果需求随时间而变化,您可以调整日志记录配置,而无需修复应用程序代码。