本文實例總結了asp.net開發中常見公共捕獲異常方式。,具體如下:
前言:在實際開發過程中,對于一個應用系統來說,應該有自己的一套成熟的異常處理框架,這樣當異常發生時,也能得到統一的處理風格,將異常信息優雅地反饋給開發人員和用戶。我們都知道,.net的異常處理是按照“異常鏈”的方式從底層向高層逐層拋出,如果不能盡可能地早判斷異常發生的邊界并捕獲異常,CLR會自動幫我們處理,但是這樣系統的開銷是非常大的,所以異常處理的一個重要原則是“早發現早拋出早處理”。但是本文總結的服務端公共捕獲異常處理可以寬泛地看做是在表現層的操作,要捕獲特定層的特定異常,不在討論范圍內。
1、BasePage類處理方式
在頁面的公共基類里重寫OnError事件。在前面這篇《asp.net實現非常實用的自定義頁面基類》里,樓豬已經貼了代碼,就不再費事了。根據經驗,很多人開發的時候幾乎都這么寫,而且對調試和維護還是很有幫助的。需要說明的是,每新添一個頁面,其對應類都必須繼承自BasePage類異常處理才起作用。
2、Global.asax處理方式
如1中所述,BasePage類的異常處理要求每一個aspx類文件都繼承它,適用性和性能顯然會打折扣。而Global.asax文件定義了asp.net應用程序中的所有應用程序對象共有的方法、屬性和事件,我們可以不采用BasePage的處理方式,在Global.asax里實現Application_Error事件并處理也可以。下面模仿BasePage類里的處理異常方法,實現如下:
/// <summary>/// 出錯處理:寫日志,導航到公共出錯頁面/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void Application_Error(object sender, EventArgs e){ if (Server.GetLastError() == null) return; Exception ex = Server.GetLastError().GetBaseException(); string error = this.DealException(ex); DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); if (ex.InnerException != null) { error = this.DealException(ex); DotNet.Common.Util.Logger.WriteFileLog(error, HttpContext.Current.Request.PhysicalApplicationPath + "LogFile"); } this.Server.ClearError(); this.Response.Redirect("/Error.aspx");}/// <summary>/// 處理異常,用來將主要異常信息寫入文本日志/// </summary>/// <param name="ex"></param>/// <returns></returns>private string DealException(Exception ex){ this.Application["StackTrace"] = ex.StackTrace; this.Application["MessageError"] = ex.Message; this.Application["SourceError"] = ex.Source; this.Application["TargetSite"] = ex.TargetSite.ToString(); string error = string.Format("URl:{0}/n引發異常的方法:{1}/n錯誤信息:{2}/n錯誤堆棧:{3}/n", this.Request.RawUrl, ex.TargetSite, ex.Message, ex.StackTrace); return error;}
新聞熱點
疑難解答
圖片精選