C#異常處理
異常是程序的執行期間產生的一個問題。 C#例外是一個特殊的情況,在程序運行時,比如嘗試除以零而引致的響應。
例外提供一種方法來從一個程序到另一個的部分轉移控製。 C#異常處理是建立在四個關鍵字:try, catch, finally 和 throw.
-
try: try塊標識代碼塊的哪些特定的異常將被激活。它的後麵是一個或多個catch塊。
-
catch: 程序捕獲異常,並在要處理的問題,程序異常處理的地方。美中不足的關鍵字表示異常的醒目。
-
finally: finally塊用來執行一組給定的語句,異常是否被拋出或不拋出。例如,如果打開一個文件時,它必須是封閉的異常是否引發。
-
throw: 一個程序拋出一個異常,當問題出現了。通過使用一個throw關鍵字。
語法
假設一個塊將引發異常,一個捕獲異常的方法使用try和catch關鍵字組合。一個try/ catch塊周圍放置可能產生異常的代碼。try / catch塊中的代碼被稱為保護代碼,使用try/ catch語句語法如下所示:
try { // statements causing exception } catch( ExceptionName e1 ) { // error handling code } catch( ExceptionName e2 ) { // error handling code } catch( ExceptionName eN ) { // error handling code } finally { // statements to be executed }
可以列出來的多個catch語句捕獲不同類型在情況下的異常,try塊中引發不同的情況不止一個例外。
在C#中的異常類
C#異常由類表示。在C#中的異常類主要是直接或間接地來源於System.Exception類。有的從System.Exception類派生的異常類,它們是System.ApplicationException和System.SystemException類。
System.ApplicationException類支持由應用程序生成的異常。因此,由程序員定義的異常應該源於這個類。
System.SystemException類是所有預定義的係統異常的基類。
下表提供了一些從Sytem.SystemException類派生的預定義的異常類:
Exception類 | 描述 |
---|---|
System.IO.IOException | 處理 I/O 錯誤 |
System.IndexOutOfRangeException | 處理的方法是指當一個數組索引超出範圍的錯誤產生 |
System.ArrayTypeMismatchException | 處理時,類型不匹配的數組類型產生的錯誤 |
System.NullReferenceException | 處理從取消引用一個空對象產生的錯誤 |
System.DivideByZeroException | 處理來自將一個除零而產生的錯誤 |
System.InvalidCastException | 處理類型轉換過程中產生的錯誤 |
System.OutOfMemoryException | 處理來自可用內存不足產生的錯誤 |
System.StackOverflowException | 處理從堆棧溢出產生的錯誤 |
處理異常
C#提供在try和catch塊的形式的結構化的解決異常處理問題。使用這些塊的核心程序語句從錯誤處理的語句分離。
這些錯誤處理模塊使用的是try, catch 和 finally 關鍵字實現。以下是當通過除以零發生拋出異常的一個例子:
using System; namespace ErrorHandlingApplication { class DivNumbers { int result; DivNumbers() { result = 0; } public void division(int num1, int num2) { try { result = num1 / num2; } catch (DivideByZeroException e) { Console.WriteLine("Exception caught: {0}", e); } finally { Console.WriteLine("Result: {0}", result); } } static void Main(string[] args) { DivNumbers d = new DivNumbers(); d.division(25, 0); Console.ReadKey(); } } }
讓我們編譯和運行上麵的程序,這將產生以下結果:
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
創建用戶定義的異常
也可以定義自己的異常。用戶自定義異常類都源自於ApplicationException類。下麵的例子說明了這一點:
using System; namespace UserDefinedException { class TestTemperature { static void Main(string[] args) { Temperature temp = new Temperature(); try { temp.showTemp(); } catch(TempIsZeroException e) { Console.WriteLine("TempIsZeroException: {0}", e.Message); } Console.ReadKey(); } } } public class TempIsZeroException: ApplicationException { public TempIsZeroException(string message): base(message) { } } public class Temperature { int temperature = 0; public void showTemp() { if(temperature == 0) { throw (new TempIsZeroException("Zero Temperature found")); } else { Console.WriteLine("Temperature: {0}", temperature); } } }
讓我們編譯和運行上麵的程序,這將產生以下結果:
TempIsZeroException: Zero Temperature found
拋出對象
可以拋出一個對象,如果它是直接或間接地來源於System.Exception類。可以使用throw語句catch塊拋出對象如下:
Catch(Exception e) { ... Throw e }