c#基礎之異常處理及自定義異常
一、什麼是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 }
五、總結
異常處理的優勢:
對使用者來說,在程式發生錯誤時,不至於程式崩潰,而可以給出提示資訊,提升使用者的使用體驗
對開發人員來說,可以在短時間內找到程式發生錯誤的位置,進而提高效率