捕獲異常你們早已經用熟了,關於finally內代碼什麼時候運行,只知道finally內的代碼最終會執行。下面就說一下try...catch...finally 代碼段的執行順序。app
try { //To do something
A(); } catch (Exception ex) { //handle exception } finally { //realise resouce }
通常帶finally的代碼如上,不管try塊內是否有異常(異常的時候執行完catch再執行finally內代碼),finally都會執行。ui
咱們爲A()方法內代碼添加try...finally後,代碼以下:spa
static void A() { try { string str = "123"; Console.WriteLine("In A() try"); } finally { Console.WriteLine("in A() finally"); } Console.WriteLine("in A()"); }
A()方法是能夠不用加catch()的,由於A的父級進行了異常處理。操作系統
此時輸出結果爲:code
In A() tryorm
In A() finallyblog
In A()ci
再看看另一種狀況,若是在finally執行前A()方法return了,執行順序如何,修改A()方法以下:資源
static string A() { try { string str = "123"; return str; } finally { Console.WriteLine("in A() finally"); } }
A中的finally依然執行。固然此時A中的try...finally...也是能夠加上catch...部分的,只是改變了異常處理的位置,而不是向包含A的上一級方法中拋出。string
MSDN的說明:
使用 finally 塊,能夠清理在 Try 中分配的任何資源,並且,即便在 try 塊中發生異常,您也能夠運行代碼。 一般,控件離開 try 語句以後,finally 的語句會阻止運行。 正常執行中 break、continue、goto 或 return 語句的執行,或對 try 語句外部異常的傳播,可能會致使發生控件轉換。
已處理的異常中會確保運行關聯的 finally 塊。 可是,若是異常未獲得處理,則 finally 塊的執行取決於如何觸發異常展開操做。 此操做又取決於計算機是如何設置的。 有關更多信息,請參見 Unhandled Exception Processing in the CLR(CLR 中的未經處理的異常處理)。
一般,當未經處理的異常停止應用程序時,finally 塊是否運行並不重要。 可是,若是您擁有的 finally 塊中的語句必須在該環境下運行,則一個解決方案是將 catch 塊添加到 try-finally 語句中。 或者,能夠捕獲多是在調用堆棧更上方的 try-finally 語句的 try 塊中引起的異常。 便可以捕獲調用了包含 try-finally 語句的方法中的、或調用了該方法的方法中的、或調用堆棧中任何方法中的異常。 若是未捕獲異常,則 finally 塊的執行取決於操做系統是否選擇觸發異常展開操做