抛出异常与记录

xra*_*bit 25 java logging exception try-catch

以下是编码良好实践的方法吗?

try {
    //my code here
} catch (Exception e) {
    logger.error("Some error ", e);
    throw new MyCustomException("Some error ", e);
}
Run Code Online (Sandbox Code Playgroud)

而且,我应该......

  • 只使用记录器?
  • 只抛出异常?
  • 做两个?

我理解,throw我可以在callstack的另一部分中捕获异常,但是可能额外的日志记录具有一些隐藏的好处,并且也很有用.

gus*_*afc 15

通常情况下,我认为你应该记录重新抛出.同时执行这两个操作只会导致每个图层一次又一次地记录异常,这使得日志难以阅读.更糟糕的是,很难弄清楚你实际拥有多少错误 - 是7个错误,还是记录了相同错误的7层应用程序?

这意味着如果您抑制异常,则记录它并说明为什么您认为不值得重新抛出.

另一方面,如果你重新抛出异常,你知道它会被捕获和被抑制(在这种情况下捕获器会记录异常及其被抑制的原因),或者它会从你的应用程序中冒出来并成为由app容器捕获,它将捕获并记录异常.每个异常在日志中只显示一次且仅显示一次.


Abi*_*san 9

在某些情况下,我会同时使用日志记录和引发异常。特别是,它在API中很有用。通过抛出异常,我们可以允许调用方对其进行处理,并通过记录日志,我们可以自行确定其根本原因。

而且,如果调用者在同一系统中,则如果我们在每个捕获中添加日志,那么将有重复的日志。

  • 我同意@Kugathasan Abimaran。我目前正在开发一个 API,并且需要在出现问题时经常安静地查看我的日志文件。同时我必须抛出异常通知客户端 (2认同)

Eya*_*der 6

使用您建议的模式时,您通常会在日志中多次报告错误事件。此外,在阅读日志时,它们之间的连接并不总是那么简单。

我个人更喜欢只记录一次错误事件,并在更高的调用级别中进行。因此,我几乎从不登录并重新抛出。我通常让异常上升到调用堆栈,直到它到达可以以某种方式处理的上下文,这就是我记录的地方。

如果异常被正确包装并重新抛出,则上下文应该从单个日志消息的堆栈跟踪中完全清楚。