1. 程式人生 > >c#基礎之異常處理及自定義異常

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     }

 

五、總結

        異常處理的優勢:

                對使用者來說,在程式發生錯誤時,不至於程式崩潰,而可以給出提示資訊,提升使用者的使用體驗

                對開發人員來說,可以在短時間內找到程式發生錯誤的位置,進而提高效率