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