0

我对这个主题进行了很多研究,但没有找到真正的答案。

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

所以我们有一个带有多个异常的 try...catch 块:

  • CancellationException 超时
  • ExecutionException 如果在线程中引发异常
  • 突然停止的 InterruptedException...

哲学是只记录消息,还是记录消息和可抛出的(所以堆栈跟踪)?

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

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

还是只记录消息错误?

stacktrace 是否被认为只出现在错误中?

谢谢你。

4

1 回答 1

1

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

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

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

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

于 2014-12-10T22:55:37.477 回答