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 块的执行取决于操做系统是否选择触发异常展开操做

相关文章
相关标签/搜索