如何处理异常?

Inf*_*ner 9 c# silverlight

这是关于最佳.net实践的问题.我总是在我的所有Web和窗体表单应用程序中捕获并存储有关异常的信息,如下所示:

  1. 用try catch包围每个方法(异常异常)
  2. 对于除前层之外的任何层,将异常抛到上面的层
  3. 在前层,将异常记录到日志文件(通常使用log4config.dll)并向用户显示用户友好消息.

这是处理异常的最佳方法吗?或者我应该在下一个项目中做些不同的事情?

Mar*_*ell 6

除非我有一些具体的原因,否则我不会加1和2; 例如改变(包装)消息; 没有必要,因为无论如何异常都会提升.并且做得不正确,您可能会意外删除所有重要的堆栈跟踪(throw;vs throw ex;- 第一个是首选).


Mik*_*ark 3

以下代码存在问题,因为它覆盖了 的原始堆栈跟踪e,这使得问题更难以诊断:

public void Foo() {
    try {
        Bar();
    } catch(Exception e) {
        throw e; // re-throw; overwrites original stacktrace in 'e'
    }
}
Run Code Online (Sandbox Code Playgroud)

以下代码不存在上述堆栈跟踪覆盖问题,但仍然不必要地冗长:

public void Foo() {
    try {
        Bar();
    } catch(Exception e) {
        throw; // re-throw; preserves original stacktrace in 'e'
    }
}
Run Code Online (Sandbox Code Playgroud)

两者都写成下面的形式会更好。这是因为,如果您在 catch 块中所做的唯一事情是重新抛出异常,则根本不需要编写 catch 块:

public void Foo() {
    Bar();
}
Run Code Online (Sandbox Code Playgroud)

  • 确切地说,“抛出 e”更糟糕,因为它会丢失堆栈并重新创建堆栈,它应该只是“抛出”,不带任何参数。 (4认同)
  • +1 表示“如果您在 catch 块中所做的唯一事情是重新抛出异常,则根本不需要编写 catch 块” (2认同)