在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");
}
}
最新文章
- 安卓初級教程(4):sqlite建立資料庫
- http status 状态码汇总
- linux shell脚本查找重复行/查找非重复行/去除重复行/重复行统计
- 从零开始学iPhone开发(5)——使用MapKit
- 怎么去除google的 安全搜索
- ISO给UIImageView增加点击事件
- fork Bomb
- 关于Python中数据对象的可变性
- [转]https方式使用git保存密码的方式
- Ajax随笔
- 转:JSP 分页显示数据 (Oracle)
- protobuf和thrift对比
- CSS书写规范与理论
- MySQL DATE_SUB()
- Page Object设计模式实践
- 爬虫值requests库
- 最长连续子序列(dp,分而治之递归)
- Python装饰器的深入理解
- Eclipse开发Web常见异常
- 如何在idea中设置Tomcat虚拟路径