try,catch和finally

时间:2017-03-05 02:15:02

标签: c# exception-handling try-catch-finally finally try-finally

假设我有一些像这样的C#代码:

try {
    Method1();
}
catch(...) {
    Method2();
}
finally {
    Method3();
}
Method4();
return;

我的问题是,如果没有抛出异常,Method3()会在Method4()之前执行,还是finally块只在return之前执行,{{1} }或continue声明?

3 个答案:

答案 0 :(得分:5)

是的,try-catchfinally块将按照您的预期顺序执行,然后执行将继续执行其余代码(在完成整个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块。

最后将始终执行 - 尽管是否存在例外。