.net中捕捉全局未處理異常的三種方式示例
前言:
我們在實際項目開發(fā)中,經(jīng)常會遇到一些不可預見的異常產(chǎn)生,有的異常在程序運行時就對其進行處理(try)
但是,有的程序不需要每一個地方都用try進行處理,那么針對這種情況,可以參照下面的方式,實現(xiàn)對異常的統(tǒng)一抓取處理,下面話不多說了,來一起看看詳細的介紹吧。
方式一、Page_Error處理頁面級未處理異常
作用域:當前的.aspx頁面
描述:在需要處理的aspx頁面的cs文件中,實現(xiàn)Page_Error方法,達到偵聽當前頁面未處理的異常
protected void Page_Error(object sender, EventArgs e) { string errorMsg = String.Empty; Exception currentError = Server.GetLastError(); errorMsg += "來自頁面的異常處理<br />"; errorMsg += "系統(tǒng)發(fā)生錯誤:<br />"; errorMsg += "錯誤地址:" + Request.Url + "<br />"; errorMsg += "錯誤信息:" + currentError.Message + "<br />"; Response.Write(errorMsg); Server.ClearError();//清除異常(否則將引發(fā)全局的Application_Error事件) }
方式二、通過HttpModule來捕獲未處理的異常
作用域:全局的request請求
描述:通過一個類實現(xiàn)IHttpModule接口,并偵聽未經(jīng)處理的異常
實現(xiàn)步驟:
1、首先需要新建一個類(MyHttpModule),該類需實現(xiàn)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異常,這個異常包含一個實際出現(xiàn)的異常 Exception ex = ctx.Server.GetLastError(); //實際發(fā)生的異常 Exception iex = ex.InnerException; response.Write("來自ErrorModule的錯誤處理<br />"); response.Write(iex.Message); ctx.Server.ClearError(); } }
2、配置文件配置相應的HttpModule節(jié)點
配置文件配置HttpModule節(jié)點時,有以下兩種方式(根據(jù)IIS版本而異)
方法1、當IIS版本為7.0以下時,在<system.web>中新增如下配置節(jié)點
<httpModules> <add name="MyHttpModule" type="MyHttpModule.MyHttpModules,MyHttpModule" /> </httpModules>
方法2、當IIS版本為7.0及其以上版本時,在<system.webServer>中新增如下配置節(jié)點
<modules> <add name="MyHttpModule" type="MyHttpModule.MyHttpModules,MyHttpModule"/> </modules>
方式三、通過Global中捕獲未處理的異常
作用域:全局的request請求
描述:通過在Global中實現(xiàn)Application_Error方法,來達到偵聽未經(jīng)處理的異常
具體代碼如下:
void Application_Error(object sender, EventArgs e) { //獲取到HttpUnhandledException異常,這個異常包含一個實際出現(xiàn)的異常 Exception ex = Server.GetLastError(); //實際發(fā)生的異常 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();//處理完及時清理異常 }
有關三種異常抓取的總結分析:
以上三種方法根據(jù)IIS處理請求的順序,可以知道,其三者觸發(fā)的先后順序是:
方式一、Page_Error處理頁面級未處理異常--抓取后未清理異常(ClearError)-->
方式二、通過HttpModule來捕獲未處理的異常--抓取后未清理異常(ClearError)-->
方式三、通過Global中捕獲未處理的異常
三種方式的作用范圍是:方式一中作用于當前的aspx頁面,方法二和方式三都作用于全局
通過上面的兩點,所以在實際使用中,如果是抓取全局的未出來的異常建議采用方式二
如果是抓取某一頁面的未處理的異常采用方式一
異常抓取后的處理邏輯總結:
按照上面的三種方式抓取到的程序中未處理的異常后,那么在實際的項目中,具體處理方式如何呢?根據(jù)自己實際的項目應用總結如下:
{
一般處理邏輯分三步:
第一步:解析具體的異常信息
第二步:解析后的異常信息落地入庫(文本日志(方便后續(xù)查問題)
、數(shù)據(jù)庫日志(方便后續(xù)查問題,統(tǒng)計提醒))
第三步:頁面重定向(將錯誤重定向到定制的具體自定義錯誤頁面)
重定向時,不需要在異常抓取的時候處理,可通過配置文件實現(xiàn)靈活處理(具體實現(xiàn)方式,見下一篇)
在異常抓取后,不要調用ClearError()來清除異常,否則配置文件設置的錯誤重定向將不起作用
}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Image顯示服務器上任意絕對路徑下的圖片(采用二進制流實現(xiàn))
有這樣一個需求:數(shù)據(jù)庫中存儲的是照片所在的絕對路徑(可以不在系統(tǒng)所在路徑下),Image控件動態(tài)加載路徑下的圖片,另類實現(xiàn)方法,感興趣的朋友可以參考下,或許本文對你學習二進制流有所幫助2013-02-02asp.net 繼承自Page實現(xiàn)統(tǒng)一頁面驗證與錯誤處理
一直以來,我都在思考以前一個項目中,后臺文件中很多的.aspx文件上的權限判斷問題,傻乎乎的我基本上每個文件當時都給加了一句2009-04-04asp.net基于windows服務實現(xiàn)定時發(fā)送郵件的方法
這篇文章主要介紹了asp.net基于windows服務實現(xiàn)定時發(fā)送郵件的方法,結合實例形式較為詳細的分析了asp.net調用Windows系統(tǒng)服務的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11