假设我有一些像这样的C#代码:
try {
Method1();
}
catch(...) {
Method2();
}
finally {
Method3();
}
Method4();
return;
我的问题是,如果没有抛出异常,Method3()会在Method4()之前执行,还是finally
块只在return
之前执行,{{1} }或continue
声明?
答案 0 :(得分:5)
是的,try-catch
的finally
块将按照您的预期顺序执行,然后执行将继续执行其余代码(在完成整个try-catch-finally
之后块)。
您可以将整个try-catch-finally
块视为一个单独的组件,就像任何其他方法调用一样(代码在其之前和之后执行)。
// Execute some code here
// try-catch-finally (the try and finally blocks will always be executed
// and the catch will only execute if an exception occurs in the try)
// Continue executing some code here (assuming no previous return statements)
示例强>
try
{
Console.WriteLine("1");
throw new Exception();
}
catch(Exception)
{
Console.WriteLine("2");
}
finally
{
Console.WriteLine("3");
}
Console.WriteLine("4");
return;
您可以see an example of this in action here产生以下输出:
1
2
3
4
答案 1 :(得分:4)
序列始终是
try
--> catch(if any exception occurs)
--> finally (in any case)
--> rest of the code (unless the code returns or if there is any uncaught exceptions from any of the earlier statements)
有用的资源:https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx
答案 2 :(得分:1)
我的问题是,如果没有抛出异常,Method3()会在Method4()之前执行,
是的,Method3
将在Method4
之前执行,因为无论是否抛出异常,执行将转到finally块然后从那里继续。
还是finally块只在return,continue或break语句之前执行?
不,它总是在try块之后执行,是否有异常。
重点
如果你有这个:
try
{
DoOne();
DoTwo();
DoThree();
}
catch{ // code}
finally{ // code}
如果DoOne()
引发异常,则永远不会调用DoTwo()
和DoThree()
。因此,不要认为整个try
块将始终执行。实际上,只有抛出异常之前的部分才会被执行,然后执行进入catch
块。
最后将始终执行 - 尽管是否存在例外。