C#異常處理及心得

C sharp中的異經常使用於處理系統級和應用程序級的錯誤狀態,它是一種結構化、統一的類型安全的處理機制。c#的異常 機制很是相似於c++的異常處理機制,可是仍是有一些重要的區別:c++

1,在 C# 中,全部的異常必須由從 System.Exception 派生的類類型的實例來表示。在 C++ 中,可使用任何類型的任何值表示異常。c#

2,在 C# 中,利用 finally 可編寫在正常執行和異常狀況下都將執行的終止代碼。在 C++ 中,很難在不重複代碼的狀況下編寫這樣的代碼。數組

3,C# 中,系統級的異常如溢出、被零除和 null 等都對應地定義了與其匹配的異常類,而且與應用程序級的錯誤狀態處於同等地位。
安全

1.1 致使異常的緣由ide

能夠以兩種不一樣的方式引起異常。函數

· throw 語句(第 ‎8.9.5 節)用於當即無條件地引起異常。控制永遠不會到達緊跟在 throw 後面的語句。spa

· 在執行 C# 語句和表達式的過程當中,有時會出現一些例外狀況,使某些操做沒法正常完成,此時就會引起一個異常。例如,在整數除法運算(第 ‎7.8.2 節)中,若是分母爲零,則會引起 System.DivideByZeroException。有關可能以此方式引起的各類異常的列表,請參見第 ‎16.4 節。線程

1.2 System.Exception code

System.Exception 類是全部異常的基類型。此類具備一些全部異常共享的值得注意的屬性:對象

· Message 是 string 類型的一個只讀屬性,它包含關於所發生異常的緣由的描述(易於人工閱讀)。

· InnerException 是 Exception 類型的一個只讀屬性。若是它的值不是 null,則它所引用的是致使了當前異常的那個異常,即表示當前異常是在處理那個 InnerException 的 catch 塊中被引起的。不然,它的值爲 null,則表示該異常不是由另外一個異常引起的。以這種方式連接在一塊兒的異常對象的數目能夠是任意的。

這些屬性的值能夠在調用 System.Exception 的實例構造函數時指定。

1.3 異常的處理方式

發生異常時,系統將搜索能夠處理該異常的最近的 catch 子句(根據該異常的運行時類型來肯定)。首先,搜索當前的方法以查找一個詞法上包含着它的 try 語句,並按順序考察與該 try 語句相關聯的各個 catch 子句。若是上述操做失敗,則在調用了當前方法的方法中,搜索在詞法上包含着當前方法調用代碼位置的 try 語句。此搜索將一直進行下去,直到找到能夠處理當前異常的 catch 子句(該子句指定一個異常類,它與當前引起該異常的運行時類型屬於同一個類或是該運行時類型所屬類的一個基類)。注意,沒有指定異常類的 catch 子句能夠處理任何異常。

找到匹配的 catch 子句後,系統將把控制轉移到該 catch 子句的第一條語句。在 catch 子句的執行開始前,系統將首先按順序執行嵌套在捕捉到該異常的 try 語句裏面的全部 try 語句所對應的所有 finally 子句。

若是沒有找到匹配的 catch 子句,則發生下列兩種狀況之一:

· 若是對匹配的 catch 子句的搜索到達一個靜態構造函數(第 ‎10.12 節)或靜態字段初始值設定項,則在致使調用該靜態構造函數的代碼位置引起 System.TypeInitializationException。該 System.TypeInitializationException 的內部異常將包含最初引起的異常。

· 若是對匹配的 catch 子句的搜索到達最初啓動當前線程的代碼處,則該線程的執行就會終止。此類終止會產生什麼影響,應由實現來定義。

特別值得注意的是在析構函數執行過程當中發生的異常。若是在析構函數執行過程當中發生異常且該異常未被捕獲,則將終止該析構函數的執行,並調用它的基類的析構函數(若是有)。若是沒有基類(如 object 類型中的狀況),或者若是沒有基類析構函數,則該異常將被忽略。

1.1 公共異常類
下列異常由某些 C# 操做引起。

1 System.ArrayTypeMismatchException

當存儲一個數組時,若是因爲被存儲的元素的實際類型與數組的實際類型不兼容而致使存儲失敗,就會引起此異常。

1 System.DivideByZeroException

在試圖用零除整數值時引起。

1 System.IndexOutOfRangeException

在試圖使用小於零或超出數組界限的下標索引數組時引起。

1 System.InvalidCastException

當從基類型或接口到派生類型的顯式轉換在運行時失敗時,就會引起此異常。

1 System.NullReferenceException

在須要使用引用對象的場合,若是使用 null 引用,就會引起此異常。

1 System.OutOfMemoryException

在分配內存(經過 new)的嘗試失敗時引起。

1 System.OverflowException

在 checked 上下文中的算術運算溢出時引起。

1 System.StackOverflowException

當執行堆棧因爲保存了太多掛起的方法調用而耗盡時,就會引起此異常;這一般代表存在很是深或無限的遞歸。

1 System.TypeInitializationException

在靜態構造函數引起異常而且沒有能夠捕捉到它的 catch 子句時引起。

okay上文的內容就是對c#語言規範中對於異常處理的總結,下面總結一下咱們這些新手常常出現的問題,請高手們補充,謝謝!
1、是否缺乏 using 指令或程序集引用?
這是我在最近的探索中常常遇到的問題,雖然已經添加引用了,可是總會提示,很折磨的說,我總結了兩種較爲一般的處理:
 
一、修改:右擊類文件--屬性--生成操做--將「內容」改成「編譯」,而後從新生成,問題解決。
 二、另外一種狀況:項目中存在多個類庫,生成項目時提示 未能找到類型或命名空間名稱「XXXX」(是否缺乏 using 指令或程序集引用?)  ,找到相應類庫中的「引用」文件夾,在其中添加對應的dll文件,單獨生成此類庫,若仍是提示,則須要查看「引用」中是否有引用其餘類庫所生成的dll文件,若是存在,則須要先確保生成該dll文件的類庫能夠正常生成,以此類推,最終生成整個項目。
2、try,catch,finally
我是這樣理解的,先執行try裏面的語句,若是try裏面的語句拋出了錯誤,就會被catch捕獲,因此就會中斷try裏面語句的執行轉而執行catch裏面的語句,若是try裏面的語句都執行完了也沒有拋出錯誤,那麼catch裏的語句就沒有機會執行了。最後不論try順利運行完畢,仍是try拋出了錯誤被catch語句捕獲並執行了catch的語句都要接着執行finally裏面的語句。可是總感受缺點什麼~

 

這裏給出一個msdn上的最佳異常處理方法,但願會有所幫助。

http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx

相關文章
相關標籤/搜索