異常介紹
我們平時在寫代碼或程序時,無意中(一般就是技術不夠),而導致程序運行時出現意外(又稱為異常),對於這個問題, 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
塊包圍你認為可能會出現異常的代碼。 -
一旦
try
塊中發生異常,控制流將按順序找到與之關聯的 catch,如果一直沒有找到關聯的,會引發最終的異常基類 Exception 內的處理程序(前提你已經 catch)。 -
如果出現異常卻沒有對應的異常處理程序,則該程序將會停止執行,並拋出對應錯誤的信息。
-
在
catch
定義了的異常變量,可以獲取對應異常類型的有關信息,比如調用堆棧的狀態和錯誤的說明,具體看 Excetion 的屬性。 -
throw
關鍵字可以顯式引發異常。 -
即使出現異常也會執行
finally
塊中的代碼。 一般來說,我們會使用finally
塊釋放資源。例如,關閉xx流。
C# 基礎回顧系列
《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》
《C# 知識回顧 - 事件入門》、《C# 知識回顧 - Event 事件》
【博主】反骨仔
【出處】http://www.cnblogs.com/liqingwen/p/6193354.html
【參考】https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/
【參考】微軟官方文檔