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容器捕获,它将捕获并记录异常.每个异常在日志中只显示一次且仅显示一次.
在某些情况下,我会同时使用日志记录和引发异常。特别是,它在API中很有用。通过抛出异常,我们可以允许调用方对其进行处理,并通过记录日志,我们可以自行确定其根本原因。
而且,如果调用者在同一系统中,则如果我们在每个捕获中添加日志,那么将有重复的日志。
使用您建议的模式时,您通常会在日志中多次报告错误事件。此外,在阅读日志时,它们之间的连接并不总是那么简单。
我个人更喜欢只记录一次错误事件,并在更高的调用级别中进行。因此,我几乎从不登录并重新抛出。我通常让异常上升到调用堆栈,直到它到达可以以某种方式处理的上下文,这就是我记录的地方。
如果异常被正确包装并重新抛出,则上下文应该从单个日志消息的堆栈跟踪中完全清楚。