【发布时间】:2012-07-21 03:25:35
【问题描述】:
当我们将一堆语句包装在 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);
}
}
这会在我的日志中留下一条面包屑痕迹,并使该链可用于上游。当然,问题是我必须用这种代码来包装我编写的每个方法。
某事告诉我我对此很愚蠢。什么是正确的方法?
【问题讨论】:
-
只要“.pdb”文件可用,您就会在堆栈跟踪中获得异常的行号。或者,当您处于方法中的逻辑点时设置某种形式的指示符,如果方法出现异常,也将其写入日志。不要把 try-catch 到处乱扔。
-
我不明白这样做的动机。在第一个示例中,堆栈跟踪的顶部应该是
do1(),是吗? -
这是一个糟糕的想法,几乎每个开发人员都曾尝试过。
-
异常的堆栈跟踪将显示异常的来源(方法和可能的行号),无论您在哪里捕获它。
-
您可能在各个级别都在使用
throw ex;。不要那么做。并停止在各个级别捕获它。抓住它,您可以以任何适当的方式处理它,无论是日志记录还是其他方式。无处可去。
标签: c# exception-handling