尝试捕获最终执行流程

时间:2011-01-26 16:15:04

标签: try-catch

如果在try-catch的catch块中抛出异常,那么将调用finally块吗?

    try
{
//some thing which throws error
}
catch
{
//again some thing throws error
}
finally
{
//final clean up
}

在这里,最终会被召唤?

谢谢, Ashwani

6 个答案:

答案 0 :(得分:4)

至少在Java和C#中,无论try块如何退出,都始终执行finally块。

如果答案是错误的,那么finally构造就没有优势,只能在try块的末尾包含代码。

答案 1 :(得分:1)

即使try块中存在异常,也必然会执行finally块。这就是finally的设计方式。

如果try块中存在异常,则控制权将转移到catch块以匹配生成的异常,然后将控制切换到finally块。

但是在这种情况下,如果try块中没有生成任何异常,则控件将不会转移到catch块,因为catch块没有任何异常1}}。
但正如我之前所说,finally块再次被绑定执行。

  

所以,最后,finally块将永远是   执行

答案 2 :(得分:1)

答案是肯定的。但是之后发生了什么?要说明完整流语义,请考虑以下事项:

private int TryCatchFinallyFlow()
{
    int i, j = 0; // set j to non-zero

    try
    {
        i = 1 / j;
        goto lSkip; // comment out;

        return i; // comment out

      lSkip:;
    }
    catch (Exception)
    {
        i = 2;

        throw; // comment out
    }
    finally
    {
        i = 3;
    }

    i = 4;

    return i;
}

private void button1_Click(object sender, EventArgs e)
{
    int i;

    try
    {
        i = TryCatchFinallyFlow();
    }
    catch (Exception)
    {
        i = -1;
    }

    MessageBox.Show(i.ToString());
}

}

你可以试验j为0或不为0,并注释掉三个“注释”行。在调试模式中逐步完成。

这将向您展示流程的工作原理。

答案 3 :(得分:0)

我知道的每种语言:是的。

答案 4 :(得分:0)

如果上面的示例中的try和catch块都存在异常,则控件不会传递给finally块。插图:

try
{
    //exception -> control goes to catch block.
}
catch
{
    //again exception ->  exits showing error
}
finally
{
    //control does not reach here
}

注意: 但是,如果上面的代码包含在某个函数中并且有正确的异常处理,即在调用函数中尝试... catch块,则最后块执行并且控制从catch上面移动到调用功能的捕获。插图:

try
{
    //exception -> goes to catch block.
}
catch
{
    //again exception ->  goes to finally block
}
finally
{
    //code here is executed -> goes to calling function's catch block
}

答案 5 :(得分:0)

是的,如果catch块中也有异常,则会执行finally块。

这是使用调试语句进行测试的代码。

<强>代码

public class Demo{
    public static void main(String args[]){
        int i,j,ans;


        try{
            System.out.println("Debug statement 1");
            i = 9;
            ans = i / 0;
            System.out.println("Debug statement 2");
        }
        catch(Exception e){
            System.out.println("Debug statement 3");
            j=5;
            ans = j/0;
            System.out.println("Debug statement 4");
        }
        finally{
            System.out.println("Finally Executed");
        }
    }
}

<强>输出

Debug statement 1
Debug statement 3
Finally Executed
Exception in thread "main" java.lang.ArithmeticException: / by zero
        at Demo.main(Demo.java:15)