C# 程序員可使用 try 塊對可能受異常影響的代碼進行分區。 關聯的 catch 塊用於處理任何結果異常。 一個包含代碼的 finally 塊,無論 try
塊中是否引發異常(例如,釋放在 try
塊中分配的資源),這些代碼都會運行。 一個 try
塊需要一個或多個關聯的 catch
塊或一個 finally
塊,或兩者。
這裡分別給出了一個 try-catch
語句,一個 try-finally
語句,和一個 try-catch-finally
語句。
try-catch:
1 static void Main(string[] args) 2 { 3 try 4 { 5 //需要執行的代碼 6 } 7 catch (Exception e) 8 { 9 //這裡可以獲取到被捕獲的異常 10 //你需要知道自己應該如何處理該異常 11 } 12 }
try-finally:
1 try 2 { 3 //需要執行的代碼 4 } 5 finally 6 { 7 //在 try 塊後執行的代碼 8 }
try-catch-finally:
1 try 2 { 3 //需要執行的代碼 4 } 5 catch (Exception e) 6 { 7 //這裡處理異常 8 } 9 finally 10 { 11 //在 try 塊(也可能是 catch 塊)後執行的代碼 12 }
【備注】不帶有 catch
或 finally
塊的 try
塊將導致編譯器錯誤。
catch
塊可以指定要捕捉的異常的該類型。 類型規范稱為“異常篩選器”。 異常類型應從 Exception 派生出來。 一般而言,不會將 Exception 指定為異常篩選器,除非您了解如何處理 try
塊中可能引發的所有異常,或者您在 catch
塊中包括了 throw 語句。
具有不同異常篩選器的多個 catch
塊可以串聯在一起。 多個 catch
數據塊的計算順序是在代碼中從頂部到底部,但是,對於所引發的每個異常,都只執行一個 catch
數據塊。 與指定的准確類型或其基類最為匹配的第一個 catch
塊被執行。 如果 catch
塊沒有指定匹配異常篩選器,則 catch
塊就不具有選定的篩選器(如果語句有的話)。 需要將帶有最具體的(即派生程度最高的)異常類的 catch
塊放在最前面。
當下列條件為真時,應該捕捉異常:
對引發異常的原因有具體的了解,並可實現特定的恢復,例如,在捕獲 FileNotFoundException 對象時提示用戶輸入新的文件名。
可以新建一個更具體的異常並引發該異常。
1 double GetNum(double[] nums,int index) 2 { 3 try 4 { 5 return nums[index]; 6 } 7 catch (IndexOutOfRangeException e) 8 { 9 throw new ArgumentOutOfRangeException("Sorry, 你想要的索引已經超出界限!"); 10 } 11 }
希望在將異常傳遞出去進行時,我們通常會處理部分異常。 在下面的示例中,catch
塊用於在再次引發異常之前,添加錯誤日志,這是我們常用的做法。
1 try 2 { 3 //嘗試訪問系統資源 4 } 5 catch (Exception e) 6 { 7 //偽代碼:記錄錯誤日志 8 log.Error(e); 9 10 //再重新拋出錯誤 11 throw; 12 }
可以使用 finally
塊清理在 try
塊中執行的操作。 如果存在,finally
塊將在最後執行,在 try
塊和任何匹配 catch
的塊之後執行。 不管是否引發異常或者是否找到與異常類型匹配的 catch
塊,finally
始終運行。
可以使用 finally
塊釋放資源(如文件流、數據庫連接和圖形句柄),而不用等待由運行時中的垃圾回收器來完成對象。 其實,我們更建議使用 using 語句。
在下面的示例中,使用 finally
塊關閉在 try
塊中打開的文件。注意,在關閉文件之前要檢查該文件句柄的狀態。 如果 try
塊無法打開文件,則文件句柄仍具有值 null
,並且 finally
塊不會嘗試關閉它。 或者,如果在 try
塊中成功打開該文件,則 finally
塊將關閉打開的文件。
1 static void Main(string[] args) 2 { 3 FileStream fs = null; 4 FileInfo fi = new System.IO.FileInfo("C:\\小二和小三的故事.txt"); 5 6 try 7 { 8 fs = fi.OpenWrite(); 9 fs.WriteByte(0); 10 } 11 finally 12 { 13 // 記得判斷 null 哦,不然可能觸發其它異常 14 if (fs != null) 15 { 16 fs.Close(); 17 } 18 } 19 20 }
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6193999.html
【參考】微軟官方文檔