我在没有找到真正答案的情况下对这个问题做了很多研究。
尝试想象一个执行多线程调用Callable的程序。 为此,我们启动一个具有特定超时的ExecutorService,它会调用所有进程。
所以我们有一个try ... catch块有多个例外:
哲学是仅记录消息,还是记录消息和throwable(所以堆栈跟踪)?
总结一下,我们应该这样做:
} catch (CancellationException ce) {
logger.error("Timeout. Process cancelled", ce);
}
或只是记录消息错误?
堆栈跟踪是否仅被视为出现错误?
谢谢。
答案 0 :(得分:0)
对于编码,您应该坚持使用以下模式:
} catch (CancellationException ce) {
logger.error("Timeout. Process cancelled", ce);
}
原因是Throwable捕获了错误的完整上下文。如果您从记录器中省略了该上下文的一部分,那么如果需要,您将无法在以后访问它。甚至包含在Java中的Throwable类也会随着时间的推移而被修改,以包含链接和抑制异常等内容。因此,即使您只想要来自此throwable的消息,您仍然可能希望查看抑制异常和异常原因的完整堆栈跟踪。
在输出端,我认为你可以证明,对于某些例外,堆栈跟踪并不重要。在某些情况下,目标受众不得或不希望看到异常堆栈跟踪。对于这些情况,应利用框架的功能来更改已发布的输出以满足目标受众。如果需求随时间而变化,您可以调整日志记录配置,而无需修复应用程序代码。