在Global.asax中 注册Application_Error事件 捕获全局异常

参考于:https://shiyousan.com/post/635813858052755170

在ASP.NET MVC中,通过应用程序生命周期中的Application_Error事件可以捕获到网站引发的所有未处理异常。

使用应用程序全局错误的一些优势:

第一点就是兼容性好,Web Form和MVC中都可以通用,如果旧的Web Form项目中是使用Application_Error处理全局异常,那么在新的MVC项目就可以很容易移植过来!此外灵活性也比较高,相比ASP.NET自带的自定义错误以及MVC的HandleError特性,可以更加自由的编写灵活的业务代码。

另外可以根据需求设定HTTP错误码,这方面也是考虑到一个SEO的问题,毕竟ASP.NET的自定义错误机智是使用302重写跳转,并不有利于SEO。虽然customErrors节点的redirectMode属性可以设置为"ResponseRewrite"(重写),但是如果在跳转的页面上不设置HTTP错误码,则HTTP状态码为200。

Application_Error处理网站异常的局限性

Application_Error事件无法处理已经被处理的异常,比如在try-catch捕捉的异常。此外由于是应用程序级别的事件,所以无法处理操作方法或者控制器级别的异常,暂时我也只想到这些局限,一般来说只要项目没有什么特殊要求都可以使用此事件处理自定义异常。

编写Application_Error事件的代码需要注意的地方

1、一定要取消GlobalFilter全局过滤器中HandleErrorAttribute的注册,也要注意检查项目中是否有其他全局过滤器对异常进行处理的,防止HTTP 500类型的服务器错误不会触发Application_Error事件(其他类型错误依然可触发)。

此外也可以关闭Web.config配置文件的自定义错误:<customErrors mode="Off"></customErrors>。因为一般情况下都是在Application_Error事件中处理要跳转的自定义错误页,这样有利于设置HTTP错误代码。


2、无论最终处理的流程如何,在流程结束或者响应输出的地方,一定要调用Server.ClearError()方法清空异常,否则异常错误依然处于未被处理的状态,如果customErrors mode="On",那么异常会被自定义错误模块处理,除非本意就是要使用这种方式跳转到错误页。

如果已经关闭了自定义错误但又没有调用ClearError方法,将会引发ASP.NET的详细错误页面(俗称黄页)。

个人使用案例

此次是为了记录程序级别,非控制器级别错误,以下为注册Application_Error代码,

protected void Application_Error(object sender, EventArgs e)
  {
    // 在出现未处理的错误时运行的代码
    Exception error = Server.GetLastError().GetBaseException();
    if (error != null)
    {
      //记录日志
      string date = DateTime.Now.ToString("yyyyMMdd");
      Tools.PublicConfig.log_Append(error.Message, "wap", "wapError_" + date + ".log"); 
    }
  }
原文地址:https://www.cnblogs.com/souphm/p/10881617.html