ASP.NET MVC全局异常处理和捕获的思路
这几天稍微研究了下ASP.NET MVC的全局异常处理以及捕获,相比ASP.NET Web Form,ASP.NET MVC的处理方式有所不同,以往是通过注册Global.asax文件中的Application_Error事件进行全局异常捕获,现在MVC可以使用强大的过滤器进行自定义错误的处理。本文作为学习笔记,将ASP.NET MVC中,我已知的几种全局异常捕获及处理的思路进行整理和对比分析。
此方法对于Web Form和MVC来说都是通用的,在ASP.NET中,只要网站程序抛出未捕获的异常都会触发Application_Error事件。我们在事件中通过Server.GetLastError()方法获取Exception对象(可转化成HttpException对象,以获取相关的HTTP错误代码)。
使用此方法一定要把GlobalFilter全局过滤器中的HandleErrorAttribute注册取消掉,也可以将配置文件中的customErrors节点关闭,否则HTTP 500的错误将不会被Application_Error事件捕获。
还要注意一点,如果想在事件中跳转到自己定义的错误页面,那么在响应输出之前一定要记得调用 Server.ClearError()方法清除异常。否则会有下面两种情况,如果自定义错误关闭,会显示错误黄页(即详细异常信息页面),如果没关闭则会跳转到自定义错误定义的页面:
效果如下:
小结:这种方法有非常好的兼容性,可以在Web Form和MVC中通用。另外一点是SEO优化十分友好,我们可以对HTTP错误码进行控制,毕竟customErrors是使用302跳转,是十分不利于SEO的。此外要注意在MVC中Server.Transfer不支持路由!
从此的开发中,又跳过一个小坑!。越努力,越幸运!!!