目錄
- 異常的結構以及執行順序
- 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; }
StackTrace:catch塊可以讀取這個屬性獲取堆疊跟蹤,可以獲取異常丟擲前呼叫的方法。如果我們構造一個新的Exception類,StackTrace屬性重置為null。訪問該屬性實際是執行了CLR程式碼。
如果一個異常丟擲,CLR記錄異常丟擲的位置,catch塊捕捉到異常,CLR會記錄捕捉到異常的位置。我們在catch塊內訪問異常物件的StackTrace屬性,實際還是會呼叫CLR程式碼,生成一個字串,裡面包含從異常位置到捕捉位置呼叫的所有方法。
後續。。。