【问题标题】:Java logging and throwing exceptionJava 日志记录和抛出异常
【发布时间】:2014-04-27 18:27:53
【问题描述】:

我知道这是一个反模式,但在我的 RESTful 应用程序中我想记录并抛出。

我有这个代码

log.warn("Cannot determine provider from name: " + name);
throw X.bad("Cannot determine provider from name: " + name);

这是一种不应该发生的情况——它只是一系列 if/else if 中的最后一个 else。但是,如果它确实发生了,它可能表示前端错误/错误。

  1. 我的 restful 堆栈可以处理异常并将它们映射到 HTTP 响应。
  2. 我还想要一个具有良好堆栈跟踪的日志条目。
  3. 我希望日志条目与它被抛出的位置相关(即记录器类别(类名)和堆栈跟踪。

我确实想过在 X.bad() 中放置一个 log.warn(...),但是日志记录类是 X,并且堆栈跟踪比需要抛出异常时更大。

有没有人有更集成的解决方案?

(我认为停止重复文本组件比什么都重要)

谢谢

罗伯

【问题讨论】:

  • 我不确定你的问题是什么。 . .你是在问你这里的代码是否可以工作,是否有更好的方法,或者别的什么?
  • 你说得对,斯科特——我没有问任何具体的问题。

标签: java exception logging


【解决方案1】:

Barry Ruzek 有一篇 2007 年的文章讨论了这个问题。 http://www.oracle.com/technetwork/articles/entarch/effective-exceptions-092345.html

整体解决方案是在调用堆栈的上层设置故障屏障。此故障屏障取代了您的第 1 步。它将捕获所有异常,并相应地记录它。

我认为您没有检查的事情是创建一个扩展 RuntimeException(即 MyAppRuntimeException)的自定义异常,并在其中添加您需要记录它的日志级别,以及您希望传输到您的任何其他字段故障屏障。

您的故障屏障还需要捕获所有其他异常(异常、运行时等)并使用默认行为管理它们。

你不需要在抛出异常之前记录,你只需要在一个地方记录:当你用你的故障屏障捕获异常时。

如果您记录堆栈跟踪,而不仅仅是消息,您仍然可以在日志中看到问题的根源。

之后,您可以像这里一样继续。发回 ReST 消息。

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-01-08
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多