当我们将一堆语句包装在 try/catch 中并且其中一个发出异常时,在 catch 中我们无法知道哪些语句导致了异常(ex.stacktrace 显示了我们当前的方法 (doit),它的调用者,其调用者的调用者等,但既不是 do1 也不是 do2):
function doit() {
try {
do1();
do2();
[...]
}
catch (Exception ex) {
// what failed?
}
}
一般来说,我已经开始包装所有语句并重新抛出,有点像:
private void do1() {
try {
// do whatever
} catch(Exception e) {
// write to my error log
throw new Exception("do1: " + e.Message, e.InnerException);
}
}
这会在我的日志中留下一条面包屑痕迹,并使该链可用于上游。当然,问题是我必须用这种代码包装我编写的每个方法。
有些事情告诉我我对此很愚蠢。什么是正确的方法?