try...catch...finally

捕獲異常你們早已經用熟了,關於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 的語句會阻止運行。 正常執行中 breakcontinuegoto 或 return 語句的執行,或對 try 語句外部異常的傳播,可能會致使發生控件轉換。

已處理的異常中會確保運行關聯的 finally 塊。 可是,若是異常未獲得處理,則 finally 塊的執行取決於如何觸發異常展開操做。 此操做又取決於計算機是如何設置的。 有關更多信息,請參見 Unhandled Exception Processing in the CLR(CLR 中的未經處理的異常處理)。

一般,當未經處理的異常停止應用程序時,finally 塊是否運行並不重要。 可是,若是您擁有的 finally 塊中的語句必須在該環境下運行,則一個解決方案是將 catch 塊添加到 try-finally 語句中。 或者,能夠捕獲多是在調用堆棧更上方的 try-finally 語句的 try 塊中引起的異常。 便可以捕獲調用了包含 try-finally 語句的方法中的、或調用了該方法的方法中的、或調用堆棧中任何方法中的異常。 若是未捕獲異常,則 finally 塊的執行取決於操做系統是否選擇觸發異常展開操做

相關文章
相關標籤/搜索