zoukankan      html  css  js  c++  java
  • try...catch...finally

    捕获异常大家早已经用熟了,关于finally内代码何时运行,只知道finally内的代码最终会执行。下面就说一下try...catch...finally 代码段的执行顺序。

                try
                {
                    //To do something
             A();
    } catch (Exception ex) { //handle exception } finally { //realise resouce }

    一般带finally的代码如上,无论try块内是否有异常(异常的时候执行完catch再执行finally内代码),finally都会执行。

    我们为A()方法内代码添加try...finally后,代码如下:

            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的父级进行了异常处理。

    此时输出结果为:

    In A() try

    In A() finally

    In A()

    再看看另外一种情况,如果在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的上一级方法中抛出。

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

  • 相关阅读:
    bzoj4105: [Thu Summer Camp 2015]平方运算
    bzoj4035: [HAOI2015]数组游戏
    bzoj1022: [SHOI2008]小约翰的游戏John
    bzoj4665: 小w的喜糖
    CodeChef:Little Elephant and Colored Coins
    bzoj4664: Count
    bzoj4498: 魔法的碰撞
    bzoj4230: 倒计时
    bzoj4532: [BeiJing2014 WinterCamp] 珠链
    python 画正态曲线
  • 原文地址:https://www.cnblogs.com/hzz521/p/5302925.html
Copyright © 2011-2022 走看看