- ASP.NET程序設計教程(第2版)
- 崔連和主編
- 1106字
- 2020-09-18 18:22:50
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塊也將執行。