我应该在global.asax中捕获所有异常吗?

mca*_*s20 3 asp.net logging exception-handling global-asax

如果我只是在我的Web应用程序中记录异常详细信息,我是否真的需要为每个层添加异常处理逻辑?为什么不让它们全部冒出堆栈跟踪到global.asax并将它们记录在那里?

Sco*_*ell 5

我建议不要在应用程序的任何层使用任何异常处理逻辑,除非:

  • 例外不是致命的,这意味着你可以采取一些行动来恢复,或者
  • 应用程序应该继续运行,异常应该"被忽略".例如:在在线零售商处结账时,您会通过电子邮件发送收据.如果失败 - 但其他订单处理成功 - 则不应向用户显示错误页面.在这里,我们希望即使存在异常,工作流也会继续.大多数例外都不属于这一类.

当然,例外 - 无论是否致命或应该被"忽略" - 都需要记录并通知开发人员.最好通过事件的事件处理程序来处理Application.Error.是的,这可以在Global.asax,但我认为使用基于HTTP模块的方法,健康监测ELMAH更清洁.

我已经写了一篇关于这个主题的文章,我想向你推荐 - ASP.NET Web应用程序的异常处理建议.以下是摘要中的文章:

我在ASP.NET应用程序中处理异常的建议可以归结为以下准则:

(a)创建并使用有意义的自定义错误页面.

(b)一般而言,不要捕捉例外情况.让它们冒泡到ASP.NET运行时.捕获异常的一些情况包括:

  • 当有一种似乎合理的方法通过执行一些替代逻辑从异常中恢复时,

  • 当应用程序的工作流的外围部分抛出异常时,该异常不应该使整个应用程序脱轨,并且

  • 当您需要通过抛出具有原始异常作为其内部异常的新异常时,在异常中包含其他信息.

(c)将所有异常记录到某些持久性存储中,并使用电子邮件(或其他一些介质)在生产中发生异常时通知开发人员.考虑使用ELMAH或ASP.NET的内置运行状况监控系统来促进此过程.