ASP.NET 中的全局错误处理

Posted

技术标签:

【中文标题】ASP.NET 中的全局错误处理【英文标题】:Global error handling in ASP.NET 【发布时间】:2011-12-14 03:02:18 【问题描述】:

全局捕获 ASP.NET 应用程序中的错误(例如:Global.asax)有什么问题吗?我已经查看了Good error handling practice 的问题,它并没有对此说太多。

我的经验一直在排除一些非常具体的情况(例如事务),我们正在编写的大多数 ASP.NET 应用程序都遵循

void ButtonEventHandler(object sender, EventArgs e) 
    Page.Validate();
    if (Page.IsValid) 
        //Do a database insert or update thru relevant datalayers.
        //If its a transaction then we rollback internally and rethrow
        //the exception.
    

为什么不只拥有一个全局异常处理程序?通常(此时)我唯一能做的就是优雅地中止操作并告诉用户重试。

【问题讨论】:

***.com/questions/155203/good-error-handling-practice 同时,我通常会捕获已知的可能异常并向用户显示一条消息,将意外异常留给全局处理。您可以捕获所有异常(大多数人反对这一点)并显示一条消息只要您记录了异常。如果您不记录异常,那么追踪错误将是一件非常痛苦的事情。您可能会花费数周时间尝试重现由罕见的数据库/服务中断引起的错误。 【参考方案1】:

处理未捕获异常的全局位置将位于Global.asax by handling Application_Error。正如 John 指出的那样,您应该始终在尽可能靠近它们可能发生的地方处理异常并做出适当的反应。

【讨论】:

但是等等,我的意思是......当然,如果我能以某种方式从源头处理异常,我会这样做,但通常剩下的唯一操作是记录错误并中止。我的意思是,例如,如果出现 SQL 超时,我该怎么办?那么我为什么要在我的每个页面中都复制这段代码呢? @MaximGershkovich 确切地说,我会将错误处理代码放在Application_Error 上,仅用于未处理的异常。【参考方案2】:

我想是的。您应该在尽可能接近它的特定操作上捕获您可能期望的异常,并采取适当的行为,但除非(或者可能在它进行一些清理和重新抛出之后跟随它)一个记录异常并继续的全局处理程序对一般的 500 响应是一个很好的默认行为。

【讨论】:

以上是关于ASP.NET 中的全局错误处理的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

ASP.NET 错误处理

用VSCode开发一个asp.net core 2.0+angular 5项目: Angular5全局错误处理

使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?

ASP.NET MVC Ajax 错误处理

asp.net mvc 3 中的错误处理