異常介紹
我們平時在寫代碼或程式時,無意中(一般就是技術不夠),而導緻程式運作時出現意外(又稱為異常),對于這個問題, C# 有專門的異常處理程式(當然其他語言也有)。
異常處理所涉及到的關鍵字有幾個,不用說都知道,已經耳熟能詳了:
try
、
catch
和
finally
等,用來處理失敗的情況。當然,盡管這些操作也有可能失敗,一般來說是釋放,清理某些資源或記錄日志等。
哪些代碼會出現異常呢:使用的基類庫 BCL、第三方類庫和我們寫的自以為是的代碼,還有,可以使用 throw 顯式抛出異常。
一種普遍出現的情形,異常很可能不是由代碼直接引發,而是由調用堆棧中更靠下的位置其它方法所引發。在這種情形下下,CLR 會展開堆棧,并查找是否有包含針對你指定異常類型的
catch
塊的代碼,如果找到的話,就會執行最先比對的
catch
塊。 如果在調用堆棧中的任意位置中,異常處理程式都沒有找到合适(你寫的)的
catch
塊,就會自動終止該程序,并向使用者顯示(抛出)一條錯誤的資訊。
在這裡我寫了一個被 0 處會出現異常(會顯式引發 DivideByZeroException 異常)的示例;如果在執行的途中出現異常,則捕獲該異常。
1 /// <summary>
2 /// 除法
3 /// </summary>
4 /// <param name="x"></param>
5 /// <param name="y"></param>
6 /// <returns></returns>
7 static double Division(double x, double y)
8 {
9 if (y == 0)
10 {
11 throw new DivideByZeroException();
12 }
13
14 return x / y;
15 }
16
17 static void Main(string[] args)
18 {
19 //假設
20 double x = 250, y = 0;
21
22 try
23 {
24 var result = Division(x, y);
25 Console.WriteLine($"result: {result}");
26 }
27 catch (DivideByZeroException e)
28 {
29
30 Console.WriteLine(e);
31 }
32
33 Console.Read();
34 }

Excetion 特點
- 所有異常類型都由基類
派生。Exception
- 使用
塊包圍你認為可能會出現異常的代碼。try
- 一旦
塊中發生異常,控制流将按順序找到與之關聯的 catch,如果一直沒有找到關聯的,會引發最終的異常基類 Exception 内的處理程式(前提你已經 catch)。try
- 如果出現異常卻沒有對應的異常處理程式,則該程式将會停止執行,并抛出對應錯誤的資訊。
- 在
定義了的異常變量,可以擷取對應異常類型的有關資訊,比如調用堆棧的狀态和錯誤的說明,具體看 Excetion 的屬性。catch
-
關鍵字可以顯式引發異常。throw
- 即使出現異常也會執行
塊中的代碼。 一般來說,我們會使用finally
塊釋放資源。例如,關閉xx流。finally
C# 基礎回顧系列
《C# 知識回顧 - 序列化》
《C# 知識回顧 - 表達式樹 Expression Trees》
《C# 知識回顧 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 了解常用的特性 Attribute》
《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》
《C# 知識回顧 - 事件入門》、《C# 知識回顧 - Event 事件》
《string 與 String,大 S 與小 S 之間沒有什麼不可言說的秘密》
《C# 知識回顧 - 裝箱和拆箱》
【部落客】反骨仔
【出處】http://www.cnblogs.com/liqingwen/p/6193354.html
【參考】https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/
【參考】微軟官方文檔