異常處理機制

K戰神發表於2015-05-05

目錄

  • 異常的結構以及執行順序
  • System.Exception異常類

一、異常的結構以及執行順序

先上一段程式碼:a是多少?

 int a = 0;
            try
            {
                a++;
                throw new Exception();
               
            }
            catch (Exception ex)
            {
                try
                {
                    a++;
                    return;
                }
                finally
                {
                    a++;
                }
            }
            finally
            {
                a++;
            }

 先說一下三個塊的執行關係(try、catch、finally)。

try塊:儘可能地將比較容易出現異常的程式碼放在try塊中,而且一個try塊至少與一個catch塊或者finally塊匹配。try塊中還是可能包含子try{}catch{}塊。

 

catch塊:1、是對抓取到的異常的一個響應,try塊有可能關聯0個或者多個catch塊。 沒有抓取到異常,跳過catch塊,執行finally塊(有的話)。可以抓取到異常,執行catch塊中的程式碼。

      2、捕捉到的型別必須為System.Exception型別或者派生型別。丟擲異常,會自上而下進行匹配,所以將範圍較小的異常型別放在上面。

       如果沒有匹配到異常型別,就會丟擲一個為處理的一場型別。如果匹配到了異常型別,就執行內層所有的的finally塊,catch塊中的程式碼執行完畢後,再執行與這個catch塊匹配的finally塊。          

      

finally塊:肯定會執行,比如釋放資源等操作。避免在finally中再次丟擲異常。

 

二、System.Exception類

 // 摘要: 
        //     獲取一個提供使用者定義的其他異常資訊的鍵/值對的集合。
        //
        // 返回結果: 
        //     一個物件,它實現 System.Collections.IDictionary 介面幷包含使用者定義的鍵/值對的集合。 預設值為空集合。
        public virtual IDictionary Data { get; }
        //
        // 摘要: 
        //     獲取或設定指向此異常所關聯幫助檔案的連結。
        //
        // 返回結果: 
        //     統一資源名稱 (URN) 或統一資源定位器 (URL)。
        public virtual string HelpLink { get; set; }
        //
        // 摘要: 
        //     獲取或設定 HRESULT(一個分配給特定異常的編碼數字值)。
        //
        // 返回結果: 
        //     HRESULT 值。
        public int HResult { get; protected set; }
        //
        // 摘要: 
        //     獲取導致當前異常的 System.Exception 例項。
        //
        // 返回結果: 
        //     一個 Exception 的例項,描述導致當前異常的錯誤。 InnerException 屬性返回與傳遞給建構函式的值相同的值,或者,如果沒有向建構函式提供內部異常值,則返回
        //     null 引用(Visual Basic 中為 Nothing)。 此屬性為只讀。
        public Exception InnerException { get; }
        //
        // 摘要: 
        //     獲取描述當前異常的訊息。
        //
        // 返回結果: 
        //     解釋異常原因的錯誤訊息或空字串 ("")。
        public virtual string Message { get; }
        //
        // 摘要: 
        //     獲取或設定導致錯誤的應用程式或物件的名稱。
        //
        // 返回結果: 
        //     導致錯誤的應用程式或物件的名稱。
        //
        // 異常: 
        //   System.ArgumentException:
        //     該物件必須為執行時 System.Reflection 物件
        public virtual string Source { get; set; }
        //
        // 摘要: 
        //     獲取呼叫堆疊上直接幀的字串表示形式。
        //
        // 返回結果: 
        //     用於描述呼叫堆疊的直接幀的字串。
        public virtual string StackTrace { get; }
        //
        // 摘要: 
        //     獲取引發當前異常的方法。
        //
        // 返回結果: 
        //     引發當前異常的 System.Reflection.MethodBase。
        public MethodBase TargetSite { get; }
View Code

StackTrace:catch塊可以讀取這個屬性獲取堆疊跟蹤,可以獲取異常丟擲前呼叫的方法。如果我們構造一個新的Exception類,StackTrace屬性重置為null。訪問該屬性實際是執行了CLR程式碼。 

如果一個異常丟擲,CLR記錄異常丟擲的位置,catch塊捕捉到異常,CLR會記錄捕捉到異常的位置。我們在catch塊內訪問異常物件的StackTrace屬性,實際還是會呼叫CLR程式碼,生成一個字串,裡面包含從異常位置到捕捉位置呼叫的所有方法。

後續。。。

相關文章