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


異常介紹

  我們平時在寫代碼或程序時,無意中(一般就是技術不夠),而導致程序運行時出現意外(又稱為異常),對於這個問題, C# 有專門的異常處理程序(當然其他語言也有)。

  異常處理所涉及到的關鍵字有幾個,不用說都知道,已經耳熟能詳了:trycatch 和 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流。

 

 
 

【博主】反骨仔 

【出處】http://www.cnblogs.com/liqingwen/p/6193354.html 

【參考】https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/

【參考】微軟官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM