.net中捕捉全局未处理异常的三种方式示例
前言:
我们在实际项目开发中,经常会遇到一些不可预见的异常产生,有的异常在程序运行时就对其进行处理(try)
但是,有的程序不需要每一个地方都用try进行处理,那么针对这种情况,可以参照下面的方式,实现对异常的统一抓取处理,下面话不多说了,来一起看看详细的介绍吧。
方式一、page_error处理页面级未处理异常
作用域:当前的.aspx页面
描述:在需要处理的aspx页面的cs文件中,实现page_error方法,达到侦听当前页面未处理的异常
protected void page_error(object sender, eventargs e) { string errormsg = string.empty; exception currenterror = server.getlasterror(); errormsg += "来自页面的异常处理<br />"; errormsg += "系统发生错误:<br />"; errormsg += "错误地址:" + request.url + "<br />"; errormsg += "错误信息:" + currenterror.message + "<br />"; response.write(errormsg); server.clearerror();//清除异常(否则将引发全局的application_error事件) }
方式二、通过httpmodule来捕获未处理的异常
作用域:全局的request请求
描述:通过一个类实现ihttpmodule接口,并侦听未经处理的异常
实现步骤:
1、首先需要新建一个类(myhttpmodule),该类需实现ihttpmodule接口,具体代码实例如下:
/// <summary> /// myhttpmodule /// </summary> public class myhttpmodules : ihttpmodule { public void init(httpapplication context) { context.error += new eventhandler(context_error); } public void context_error(object sender, eventargs e) { //此处处理异常 httpcontext ctx = httpcontext.current; httpresponse response = ctx.response; httprequest request = ctx.request; //获取到httpunhandledexception异常,这个异常包含一个实际出现的异常 exception ex = ctx.server.getlasterror(); //实际发生的异常 exception iex = ex.innerexception; response.write("来自errormodule的错误处理<br />"); response.write(iex.message); ctx.server.clearerror(); } }
2、配置文件配置相应的httpmodule节点
配置文件配置httpmodule节点时,有以下两种方式(根据iis版本而异)
方法1、当iis版本为7.0以下时,在<system.web>中新增如下配置节点
<httpmodules> <add name="myhttpmodule" type="myhttpmodule.myhttpmodules,myhttpmodule" /> </httpmodules>
方法2、当iis版本为7.0及其以上版本时,在<system.webserver>中新增如下配置节点
<modules> <add name="myhttpmodule" type="myhttpmodule.myhttpmodules,myhttpmodule"/> </modules>
方式三、通过global中捕获未处理的异常
作用域:全局的request请求
描述:通过在global中实现application_error方法,来达到侦听未经处理的异常
具体代码如下:
void application_error(object sender, eventargs e) { //获取到httpunhandledexception异常,这个异常包含一个实际出现的异常 exception ex = server.getlasterror(); //实际发生的异常 exception iex = ex.innerexception; string errormsg = string.empty; string particular = string.empty; if (iex != null) { errormsg = iex.message; particular = iex.stacktrace; } else { errormsg = ex.message; particular = ex.stacktrace; } httpcontext.current.response.write("来自global的错误处理<br />"); httpcontext.current.response.write(errormsg); server.clearerror();//处理完及时清理异常 }
有关三种异常抓取的总结分析:
以上三种方法根据iis处理请求的顺序,可以知道,其三者触发的先后顺序是:
方式一、page_error处理页面级未处理异常--抓取后未清理异常(clearerror)-->
方式二、通过httpmodule来捕获未处理的异常--抓取后未清理异常(clearerror)-->
方式三、通过global中捕获未处理的异常
三种方式的作用范围是:方式一中作用于当前的aspx页面,方法二和方式三都作用于全局
通过上面的两点,所以在实际使用中,如果是抓取全局的未出来的异常建议采用方式二
如果是抓取某一页面的未处理的异常采用方式一
异常抓取后的处理逻辑总结:
按照上面的三种方式抓取到的程序中未处理的异常后,那么在实际的项目中,具体处理方式如何呢?根据自己实际的项目应用总结如下:
{
一般处理逻辑分三步:
第一步:解析具体的异常信息
第二步:解析后的异常信息落地入库(文本日志(方便后续查问题)
、数据库日志(方便后续查问题,统计提醒))
第三步:页面重定向(将错误重定向到定制的具体自定义错误页面)
重定向时,不需要在异常抓取的时候处理,可通过配置文件实现灵活处理(具体实现方式,见下一篇)
在异常抓取后,不要调用clearerror()来清除异常,否则配置文件设置的错误重定向将不起作用
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。