如果在try-catch的catch块中抛出异常,那么将调用finally块吗?
try
{
//some thing which throws error
}
catch
{
//again some thing throws error
}
finally
{
//final clean up
}
在这里,最终会被召唤?
谢谢, Ashwani
答案 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)