<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        asp.net開發中常見公共捕獲異常方式總結(附源碼)

        來源:懂視網 責編:小采 時間:2020-11-27 22:38:02
        文檔

        asp.net開發中常見公共捕獲異常方式總結(附源碼)

        asp.net開發中常見公共捕獲異常方式總結(附源碼):本文實例總結了asp.net開發中常見公共捕獲異常方式。分享給大家供大家參考,具體如下: 前言:在實際開發過程中,對于一個應用系統來說,應該有自己的一套成熟的異常處理框架,這樣當異常發生時,也能得到統一的處理風格,將異常信息優雅地反饋給開發人員和用
        推薦度:
        導讀asp.net開發中常見公共捕獲異常方式總結(附源碼):本文實例總結了asp.net開發中常見公共捕獲異常方式。分享給大家供大家參考,具體如下: 前言:在實際開發過程中,對于一個應用系統來說,應該有自己的一套成熟的異常處理框架,這樣當異常發生時,也能得到統一的處理風格,將異常信息優雅地反饋給開發人員和用

        本文實例總結了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;
        }
        
        

        上面方式的好處是,寫一次代碼,應用程序發生的大部分異常它都給你捕捉處理了。樓豬要在這里由衷地發一番感慨,感謝ms為我們提供了這么優秀的框架,太省事了吧。

        3、IHttpModule接口處理

        1和2的處理方式大家都是非常熟悉的,樓豬在實際開發中基本上都是遵循上面兩種寫法,而且樓豬因為有了2中這種大小通吃的處理方式,甚至已經激動地感謝ms了。但是,在asp.net程序調用線程進行異步處理的時候,容易發生在后臺線程或線程池里拋出的異常并不能被1或(和)2完全捕捉到,這就涉及到asp.net下未捕獲異常的處理。也就是說樓豬以前做過的很多大小項目中對異常的處理是不完備的。這難道是nc樓豬沒有先謝國家種下的惡果嗎?感謝國家,感謝ms,感謝博客園,感謝無私的xdjm,感謝自己......

        asp.net下未捕獲異常的處理步驟如下:

        (1)、創建一個實現IHttpModule接口的類

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Web;
        using System.Web.UI;
        using System.Web.UI.WebControls;
        using System.Text;
        namespace DotNet.Common.WebForm
        {
         using DotNet.Common.Util;
         /// <summary>
         /// 通用未捕獲異常處理 
         /// </summary>
         public class AspNetUnhandledExceptionModule : IHttpModule
         {
         static object syncObj = new object();
         static bool isInit = false;
         public AspNetUnhandledExceptionModule()
         {
         }
         #region IHttpModule Methods
         public void Init(HttpApplication context)
         {
         lock (syncObj)
         {
         if (!isInit)
         {
         AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
         isInit = true;
         }
         }
         }
         public void Dispose()
         {
         }
         #endregion
         #region OnUnhandledException
         void OnUnhandledException(object o, UnhandledExceptionEventArgs e)
         {
         if (e.ExceptionObject == null) return;
         Exception ex = e.ExceptionObject as Exception;
         string error = string.Format("引發異常的方法:{0}\n錯誤信息:{1}\n錯誤堆棧:{2}\n",
         ex.TargetSite, ex.Message, ex.StackTrace);
         Logger.WriteFileLog(error, AppDomain.CurrentDomain.BaseDirectory + "LogFile");
         }
         #endregion
         }
        }
        
        

        (2)、web.config節點配置

        <httpModules>
         <add name="AspNetUnhandledExceptionModule" type="DotNet.Common.WebForm.AspNetUnhandledExceptionModule, DotNet.Common.WebForm"></add>
        </httpModules>
        
        

        最后貼出測試代碼:

        protected void Page_Load(object sender, EventArgs e)
        {
         if (!IsPostBack)
         {
         System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Test), null);
         }
        }
        protected void Test(object state)
        {
         int[] numArr = new int[100];
         numArr[100] = 100; //異常
        }
        
        

        需要說明的是,通過線程或者線程池處理的程序,在發生異常時,每個線程都會有它自己獨立的上下文,所以HttpContext對象應盡可能少地出現在異常處理階段。

        小結:不知道還有多少童鞋認為異常處理就是在代碼里try...catch一下,拋出異常然后完事?如果有的話,呵呵,當年樓豬是拿“沒有人天生就是十全十美的”這句話來安慰自己的。當然了,try...catch也不是不可以,只能說明我們對待異常的態度太草率了。為了顯得我們的專業和全面,請參考其他異常處理專業性文章研讀一番,相比異常處理的核心思想(異常處理的“大智慧”),這篇文章總結的(異常處理的“小技巧”)對初學者而言可能也是誤導之作,請務必留意甄別。

        完整實例代碼代碼點擊此處本站下載。

        希望本文所述對大家asp.net程序設計有所幫助。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        asp.net開發中常見公共捕獲異常方式總結(附源碼)

        asp.net開發中常見公共捕獲異常方式總結(附源碼):本文實例總結了asp.net開發中常見公共捕獲異常方式。分享給大家供大家參考,具體如下: 前言:在實際開發過程中,對于一個應用系統來說,應該有自己的一套成熟的異常處理框架,這樣當異常發生時,也能得到統一的處理風格,將異常信息優雅地反饋給開發人員和用
        推薦度:
        標簽: 異常 捕捉 總結
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 久久久久久国产a免费观看不卡| 91在线亚洲综合在线| A国产一区二区免费入口| 亚洲天堂免费在线视频| 不卡视频免费在线观看| 国产V亚洲V天堂无码久久久| 国产性生大片免费观看性| 亚洲熟妇无码八AV在线播放| 两个人看的www免费视频| 婷婷精品国产亚洲AV麻豆不片| 无码中文字幕av免费放dvd| 亚洲精品亚洲人成在线观看麻豆 | 中文在线观看免费网站| 亚洲Av综合色区无码专区桃色| 免费无码一区二区三区| 亚洲熟妇av一区| 宅男666在线永久免费观看 | 在线观看日本亚洲一区| 国产成人免费永久播放视频平台| 免费看美女午夜大片| 亚洲人成图片小说网站| 日本免费网站视频www区| 在线看亚洲十八禁网站| 亚洲乱码国产乱码精品精| 永久看日本大片免费35分钟| 亚洲乱码无人区卡1卡2卡3| 亚洲日韩精品无码专区网站| 久久久久久影院久久久久免费精品国产小说 | 亚洲成av人片不卡无码| 毛片免费观看网站| 在线播放免费人成视频网站| 五月天网站亚洲小说| 日韩高清免费在线观看| 全免费a级毛片免费看| 亚洲色偷精品一区二区三区| 亚洲人成网站色在线入口| 7m凹凸精品分类大全免费| 欧美激情综合亚洲一二区| 亚洲av无码片在线播放| 免费毛片在线播放| 国产精品免费AV片在线观看|