在 C# 中,程序中的運行時錯誤通過使用一種稱為“異常”的機制在程序中傳播。 異常由錯誤的代碼引發,並由能夠更正錯誤的代碼進行捕捉。 異常可由 .NET 的公共語言運行時 (CLR) 或由程序中的代碼引發。 一旦引發了一個異常,這個異常就會在調用堆棧中向上傳播,直到找到針對它的 catch 語句。未捕獲的異常由系統提供的通用異常處理程序處理,也就是你經常看到的一個對話框。
異常由從 Exception 派生的類進行表示。此類標識異常的類型,並包含詳細描述異常的屬性。這裡演示自定義一個新的異常類,並可以由你自定義配置異常的屬性(可選),然後使用 throw 關鍵字引發該對象(即異常)。
1 /// <summary>
2 /// 定義新異常
3 /// </summary>
4 class MyException : Exception
5 {
6 public MyException(string msg) { }
7 }
8
9 /// <summary>
10 /// 拋出新定義的異常
11 /// </summary>
12 static void ThrowMyExcetion()
13 {
14 throw new MyException("Sorry, this is test!");
15 }
在引發異常之後,運行時檢查當前語句以確定它是否在 try 塊中。 如果是,則檢查與該 try 塊關聯的任何 catch 塊,以確定它們是否能夠捕獲該異常。 Catch 塊通常會指定異常類型;如果該 catch 塊的類型與異常或異常的基類的類型相同(或匹配),則該 catch 塊就能夠處理。
1 static void Main(string[] args)
2 {
3 try
4 {
5 ThrowMyExcetion(); //直接調用拋出異常的方法
6 }
7 catch (MyException e)
8 {
9 Console.WriteLine(e);
10 }
11
12 Console.Read();
13 }
1 static void Main(string[] args)
2 {
3 StreamWriter sw = null;
4
5 try
6 {
7 sw = new StreamWriter(@"C:\book\小二和小三的故事.txt");
8 sw.Write("You are 250.");
9 }
10 catch (FileNotFoundException e)
11 {
12 //將具體的異常放在第一位
13 Console.WriteLine(e);
14 }
15 catch (IOException e)
16 {
17 //將並不具體的放在相對後面的位置
18 Console.WriteLine(e);
19 }
20 catch (Exception e)
21 {
22 Console.WriteLine(e);
23 }
24 finally
25 {
26 if (sw != null)
27 {
28 sw.Close();
29 }
30 }
31
32 Console.Read();
33 }
執行 catch 塊之前,運行時會檢查 finally 塊。 Finally 塊使程序員能夠清除中止的 try 塊可能遺留下的任何模糊狀態,或者釋放任何外部資源(例如圖形句柄、數據庫連接或文件流),而無需等待運行時中的垃圾回收器終結這些對象。 例如:
1 static void Main(string[] args)
2 {
3 FileStream fs = null;
4 FileInfo fi = new FileInfo(@"小二和小三的故事.txt");
5
6 try
7 {
8 fs = fi.OpenWrite();
9 fs.WriteByte(0);
10 }
11 finally
12 {
13 //記住哦,如果你忘記 close,將會引發 IO 異常!
14 //if (fs != null)
15 //{
16 // fs.Close();
17 //}
18 }
19
20 try
21 {
22 fs = fi.OpenWrite();
23 fs.WriteByte(1);
24 Console.WriteLine("OK!");
25 }
26 catch (IOException e)
27 {
28 Console.WriteLine("Fail!");
29 }
30
31 Console.Read();
32 }
【參考】微軟官方文檔