一、什麼是c#中的異常? 異常是程式運行中發生的錯誤,異常處理是程式的一部分。c#中的異常類主要是直接或者間接的派生於 System.Exception類 ,也就是說System.Exception類是所有預定義的系統異常的基類。錯誤的出現並不總是編寫應用的程式員的原因,有的時候應用程式也會因為終端 ...
一、什麼是c#中的異常?
異常是程式運行中發生的錯誤,異常處理是程式的一部分。c#中的異常類主要是直接或者間接的派生於 System.Exception類 ,也就是說System.Exception類是所有預定義的系統異常的基類。錯誤的出現並不總是編寫應用的程式員的原因,有的時候應用程式也會因為終端用戶的操作不當而發生錯誤。無論如何,在編寫程式前都應該預測應用程式和代碼中出現的錯誤。
二、常見的異常都有哪些?
① ArrayTypeMismatchException
向數組中存數據時,存入的數據與數組定義的數據類型不同的時候便會出現該異常
② DivideByZeroException
用零除整數時引發該異常
③ IndexOutOfRangeException
數組越界異常
④ NullReferenceException
對象引用為空異常
⑤ OverflowException
算數運算溢出
⑥ InvalidCastException
運行時強制轉換無效異常
三、異常處理
使用如下代碼結構來捕獲和處理異常
try{
//try塊中包含容易產生異常的代碼
}
catch{
//異常處理代碼
}
finally{
//用於消除try塊中分配的任何資源
//以及即使發生異常也需要繼續運行的代碼
}
其中finally代碼塊是try-catch結構執行完成後,無論是否發生異常,finally代碼塊都會執行。即便是寫代碼時在try-catch結構里return了,仍舊是會執行了finally代碼塊之後再去return。
接下來看一個簡單的異常捕獲及處理的例子:
1 public class MyException 2 { 3 public static void Main() 4 { 5 try 6 { 7 A(); 8 B(); 9 C(null); 10 } 11 //捕獲A,B,C方法拋出的異常 12 catch (Exception ex) 13 { 14 //列印出異常信息 15 Console.WriteLine(ex); 16 Console.ReadKey(); 17 } 18 } 19 20 static void A() 21 { 22 // throw語法. 23 try 24 { 25 //引發零除異常 26 int value = 1 / int.Parse("0"); 27 } 28 catch 29 { 30 //捕獲到異常不做處理繼續拋出異常 31 throw; 32 } 33 } 34 35 static void B() 36 { 37 // 過濾異常類型. 38 try 39 { 40 int[] array = new int[]{ 1, 2, 3 }; 41 //引發數組越界異常 42 array[6] = 4; 43 } 44 //捕獲到數組越界異常 45 catch (IndexOutOfRangeException ex) 46 { 47 //拋出數組越界異常 48 throw ex; 49 } 50 } 51 52 static void C(string value) 53 { 54 // 創建新的異常. 55 if (value == null) 56 { 57 //拋出新的異常 58 throw new ArgumentNullException("value"); 59 } 60 } 61 }
值得一提的是推薦使用throw來拋出異常。因為throw ex會將到現在為止的所有信息清空,認為你catch到的異常已經被處理了,只不過處理過程中又拋出新的異常,從而找不到真正發生異常的代碼位置。
四、自定義異常
自定義異常應該具有以下三個特征:
① 繼承自System.ApplicationException類,並且使用Exception作為自定義異常類名的結尾
② 包含三個構造函數:一個無參構造函數;一個字元串參數的構造函數;一個字元串參數,一個內部異常作為參數的構造 函數
③ 拋出自定義異常:throw new MyException(); 捕獲自定義異常:Catch(MyException){ }
舉個例子:
1 public class MyException : ApplicationException 2 { 3 private string error; 4 private Exception innerException; 5 //無參數構造函數 6 public MyException() 7 { 8 9 } 10 //帶一個字元串參數的構造函數 11 public MyException(string msg) 12 { 13 error = msg; 14 } 15 //帶有一個字元串參數和一個內部異常信息參數的構造函數 16 public MyException(string msg, Exception exception) 17 { 18 innerException = exception; 19 error = msg; 20 } 21 public string GetError() 22 { 23 return error; 24 } 25 }
五、總結
異常處理的優勢:
對用戶來說,在程式發生錯誤時,不至於程式崩潰,而可以給出提示信息,提升用戶的使用體驗
對開發人員來說,可以在短時間內找到程式發生錯誤的位置,進而提高效率