C#6.0語言規範(十六) 異常
阿新 • • 發佈:2018-10-04
exc out mex 這樣的 不兼容 classes exce 析構函數 不同
C#中的異常提供了一種結構化,統一且類型安全的方法來處理系統級和應用程序級錯誤條件。C#中的異常機制與C ++的異常機制非常相似,但有一些重要的區別:
- 在C#中,所有異常必須由派生自的類類型的實例表示
System.Exception
。在C ++中,任何類型的任何值都可用於表示異常。 - 在C#中,finally塊(try語句)可用於編寫在正常執行和異常條件下執行的終止代碼。在沒有重復代碼的情況下,這樣的代碼很難用C ++編寫。
- 在C#中,系統級異常(例如溢出,被零除和空取消引用)具有明確定義的異常類,並且與應用程序級錯誤條件相同。
異常的原因
可以通過兩種不同的方式拋出異常。
- 一個
throw
聲明(throw語句)立即無條件地拋出一個異常。控制永遠不會達到緊隨其後的聲明throw
。 - 在處理C#語句和表達式期間出現的某些異常情況會導致在某些情況下無法正常完成操作時發生異常。例如,如果分母為零,則整數除法運算(除法運算符)拋出a
System.DivideByZeroException
。請參閱公共異常類以獲取以這種方式可能發生的各種異常的列表。
System.Exception類
本System.Exception
類是所有異常的基本類型。此類有一些值得註意的屬性,所有異常共享:
Message
是一個只讀屬性string
,包含對異常原因的人類可讀描述。InnerException
Exception
。如果其值為非null,則它引用導致當前異常的異常 - 也就是說,當前異常是在處理該異常的catch塊中引發的InnerException
。否則,其值為null,表示此異常不是由另一個異常引起的。以這種方式鏈接在一起的異常對象的數量可以是任意的。
可以在對實例構造函數的調用中指定這些屬性的值System.Exception
。
如何處理異常
異常由try
語句(try語句)處理。
發生異常時,系統將搜索catch
可以處理異常的最近子句,具體由異常的運行時類型決定。首先,在當前方法中搜索詞法封閉try
語句,並按順序考慮try語句的關聯catch子句。如果失敗,則搜索調用當前方法的方法,以查找 try
包含對當前方法的調用點的詞法封閉語句。此搜索將繼續,直到catch
找到可以處理當前異常的子句,方法是命名與拋出的異常的運行時類型相同的類或基類的異常類。一個catch
條款,沒有指定的異常類可以處理任何異常。
一旦找到匹配的catch子句,系統就會準備將控制轉移到catch子句的第一個語句。在執行catch子句開始之前,系統首先按順序執行finally
與try語句關聯的任何子句,這些子句比捕獲該異常的語句更嵌套。
如果找不到匹配的catch子句,則會發生以下兩種情況之一:
- 如果搜索匹配的catch子句到達靜態構造函數(靜態構造函數)或靜態字段初始化程序,則會
System.TypeInitializationException
在觸發靜態構造函數調用的位置拋出a 。System.TypeInitializationException
包含最初拋出的異常的內部異常。 - 如果搜索匹配的catch子句到達最初啟動該線程的代碼,則終止執行該線程。這種終止的影響是實現定義的。
析構函數執行期間發生的異常值得特別提及。如果在析構函數執行期間發生異常,並且未捕獲該異常,則終止該析構函數的執行並調用基類的析構函數(如果有)。如果沒有基類(如object
類型的情況)或者沒有基類析構函數,則拋棄該異常。
常見異常類
某些C#操作拋出以下異常。
System.ArithmeticException |
算術運算期間發生的異常的基類,例如System.DivideByZeroException 和System.OverflowException 。 |
System.ArrayTypeMismatchException |
當存儲進入數組失敗時拋出,因為存儲元素的實際類型與數組的實際類型不兼容。 |
System.DivideByZeroException |
當嘗試將積分值除以零時拋出。 |
System.IndexOutOfRangeException |
嘗試通過小於零的索引或超出數組邊界索引數組時拋出。 |
System.InvalidCastException |
在運行時從基類型或接口到派生類型的顯式轉換失敗時拋出。 |
System.NullReferenceException |
當null 引用以導致需要引用對象的方式使用時拋出。 |
System.OutOfMemoryException |
嘗試分配內存(via new )失敗時拋出。 |
System.OverflowException |
當checked 上下文中的算術運算溢出時拋出。 |
System.StackOverflowException |
當執行堆棧因為有太多掛起的方法調用而耗盡時拋出; 通常表示非常深或無限遞歸。 |
System.TypeInitializationException |
當靜態構造函數拋出異常時拋出,並且不catch 存在捕獲它的子句。 |
C#6.0語言規範(十六) 異常