.net捕捉全局未處理異常的3種方式


前言:  

 我們在實際項目開發中,經常會遇到一些不可預見的異常產生,有的異常在程序運行時就對其進行處理(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()來清除異常,否則配置文件設置的錯誤重定向將不起作用

  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM