假设我有以下代码:
void foo() {
/* ... */
try {
bar(param1);
} catch (MyException e) {
/* ??? */
}
}
void bar(Object param1) throws MyException {
/* ... */
try {
baz(param2);
} catch (MyException e) {
/* ??? */
}
}
void baz(Object param2) throws MyException {
/* ... */
if (itsAllATerribleMistakeOhNo) {
/* ??? */
throw new MyException("oops, error.");
}
}
我想知道应该在哪里以及如何记录错误。
- 在下面的 baz() 中发生错误的地方,我确切地知道什么操作出了差错,并且可以记录该事实。
- 在顶部,我有最一般的上下文(例如,在处理过程中我们遇到错误的连接的 IP 是什么。)
- 一路上,我可能有一些在顶部或底部都不知道的上下文。
另一个复杂情况是,当您从顶部查看时,底部的错误可能不会真正被视为错误(例如,在数据库中查找某些内容失败;也许您不确定) - 所以我可能会选择.logger.WARN()
而不是logger.ERROR()
.
所以,上面我描述了 3 个位置(底部、顶部和沿途)——但这不仅仅是在哪里记录的问题,还有要扔什么的问题。在中间的每个级别,您都有 2x2 选项:
- 记录/不记录消息
- 抛出原始异常/将异常包装在带有添加消息的新异常中。
关于这些复杂的选择,最佳实践或一些常识是什么?
注意:我不是在问一般的错误处理/异常使用,只是关于上面描述的困境。