引发异常与日志记录

2022-09-01 02:35:28

以下编码方式是好的做法吗?

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

此外,我应该.

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

我知道,我可以在调用堆栈的另一部分中捕获异常,但也许额外的日志记录有一些隐藏的好处,并且也很有用。throw


答案 1

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

这意味着,如果您禁止显示异常,则会记录它并说明为什么您认为不值得重新删除。

另一方面,如果重新引发异常,则知道它要么将被捕获并禁止显示(在这种情况下,捕获程序会记录异常以及它被禁止的原因),要么它将从你的应用中冒出来并被应用程序容器捕获,这将捕获并记录异常。每个异常在日志中显示一次,而且只显示一次。


答案 2

在某些情况下,我同时使用这两种方法,记录并引发异常。特别是,它在 API 中很有用。通过引发异常,我们允许调用方处理它,并且通过日志记录,我们可以自己确定它的根本原因。

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