官术网_书友最值得收藏!

3.9 異常處理

異常是指程序在運行時產生的錯誤,借助C#的異常處理系統,能夠以結構化的、可控制的方式來處理運行時錯誤。

異常處理的主要優點是,它可以自動加載許多錯誤處理代碼,而在以前,開發人員必須手動把它們輸入到任何大型程序中。

3.9.1 SystemException類

在C#中,使用類表示異常。

所有的異常類都由內置的異常類Exception派生而來,該類是System名稱空間的一部分。

所有的異常類都是Exception類的子類。

SystemException類是Exception類的一個重要子類。CLR產生的所有異常都來自于該異常類。

System中的常用標準異常如下。

1)ArrayTypeMismatchException:所有存儲的值類型與數組類型不兼容。

2)DivideByZeroException:被零除。

3)IndexOutOfRangeException:數組索引超出邊界。

4)InvalidCastException:運行時強制轉換無效。

5)OutOfMemoryException:沒有足夠的空閑內存支持程序繼續執行。

6)OverflowException:運算溢出。

7)NullReferenceException:試圖對空引用進行操作。

3.9.2 使用try和catch關鍵字

使用try和catch關鍵字配合來組織易錯程序代碼,是C#中典型的異常處理方式。以下是try-catch代碼組織方式的結構。

查看下列代碼。

上述代碼運行之后,因為循環體中i的大小會超過數組元素的上界,會引發“數組索引超出邊界”的異常,則代碼會馬上跳轉到catch后的代碼段,運行其中的代碼。

3.9.3 使用異常處理的優點

異常處理的最大優點之一是,它允許程序對錯誤做出響應并繼續執行。編寫下列代碼并運行。

成功運行上述代碼之后,讀者會發現,程序在運行到i等于1和i等于4時都會拋出“DivideByZeroException”即“被零除”的錯誤。在顯示“不能被零除!”的錯誤信息之后,程序會繼續運行。

3.9.4 使用多條catch子句

也可以使用多條catch子句接收異常,在發生不同異常的時候,由不同catch子句接收相應的異常。觀察下列代碼。

運行上述代碼,會發現運行結果中出現兩次“不能被零除!”的提示,最后出現“超出數組范圍了!”的提示,即為使用多條catch子句接收異常的運行效果。

3.9.5 捕獲所有異常

如果無法確定會出現哪種異常,仍然想使用異常處理的try-catch子句。則可以在catch后面不列出異常名稱,而直接給出響應代碼。觀察下列程序。

注意:大多數情況下,不應該使用“捕獲所有異常”的處理程序作為異常處理的方式。通常最好是分別處理代碼產生的每個異常。不適當地使用“捕獲所有異常”的處理程序會導致掩蓋原本在測試期間可以捕獲的錯誤。

3.9.6 手動拋出異常(throw)

在某些情況下,需要程序“制造”異常,即在上述異常都沒有發生的情況下,手動拋出異常。這就需要使用“throw”關鍵字。拋出的異常必須使用new關鍵字,后跟一個具體的異常名稱。如throw new DivideByZeroException()。觀察下列代碼。

3.9.7 finally語句

有時必須為程序離開try/catch塊執行的操作編寫一段代碼。可以添加在try/catch結構后面的finally塊中。

注意:無論try/catch塊在什么時候因為什么條件結束,finally塊只要存在都將必然執行。也就是說,不論try塊是正常結束還是異常結束,最終都會執行finally塊中的代碼。即使try塊中的代碼或catch語句中的代碼使得該方法返回,finally塊也將執行。

主站蜘蛛池模板: 德江县| 磐石市| 宿迁市| 南漳县| 五大连池市| 西乡县| 紫阳县| 区。| 蒙山县| 新乡市| 泰兴市| 枣阳市| 米脂县| 长宁区| 大足县| 呼伦贝尔市| 阿勒泰市| 北流市| 墨江| 新余市| 怀来县| 察雅县| 嘉荫县| 荔波县| 丰镇市| 安顺市| 佛山市| 台南市| 彭泽县| 岳池县| 叶城县| 寿阳县| 大丰市| 明水县| 邢台市| 靖江市| 东辽县| 曲周县| 襄垣县| 镶黄旗| 曲麻莱县|