天天看點

[C#] C# 知識回顧 - 異常介紹

異常介紹

  我們平時在寫代碼或程式時,無意中(一般就是技術不夠),而導緻程式運作時出現意外(又稱為異常),對于這個問題, 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         }      
[C#] C# 知識回顧 - 異常介紹

Excetion 特點

  • 所有異常類型都由基類 

    Exception

     派生。
  • 使用 

    try

     塊包圍你認為可能會出現異常的代碼。
  • 一旦 

    try

     塊中發生異常,控制流将按順序找到與之關聯的 catch,如果一直沒有找到關聯的,會引發最終的異常基類 Exception 内的處理程式(前提你已經 catch)。
  • 如果出現異常卻沒有對應的異常處理程式,則該程式将會停止執行,并抛出對應錯誤的資訊。
  • 在 

    catch

     定義了的異常變量,可以擷取對應異常類型的有關資訊,比如調用堆棧的狀态和錯誤的說明,具體看 Excetion 的屬性。
  • throw

     關鍵字可以顯式引發異常。
  • 即使出現異常也會執行 

    finally

     塊中的代碼。 一般來說,我們會使用 

    finally

     塊釋放資源。例如,關閉xx流。

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/

【參考】微軟官方文檔