如果我在c#中的catch()中有一个return,那么finally中的代码是否会被执行?

时间:2012-08-28 09:35:57

标签: c# try-catch-finally

我有以下代码段/示例。这不是我正在编写的代码,以便提出一个关于catch的问题,最后并返回:

try
{
    doSomething();
}
catch (Exception e)
{
    log(e);
    return Content("There was an exception");
}
finally
{
    Stopwatch.Stop();
}
if (vm.Detail.Any())
{
    return PartialView("QuestionDetails", vm);
}
else
{
    return Content("No records found");
}

根据我的理解,如果try块中有异常,它将会捕获。但是如果catch中有return语句,那么最后会执行吗?这是编写catch的最终方法吗?

5 个答案:

答案 0 :(得分:14)

  

在已处理的异常中,保证关联的finally块   要运行。但是,如果异常未处理,则执行   finally块取决于异常展开操作的方式   触发。反过来,这取决于您的计算机的设置方式。   有关详细信息,请参阅Unhandled Exception Processing in the CLR

参考:Try-Finally

答案 1 :(得分:10)

是的finally将被执行,即使您之前有return的内容。

  

finally块对于清理try块中分配的任何资源以及运行任何必须执行的代码(即使try块中发生异常)也很有用。通常,当控制离开try语句时,执行finally块的语句,是否由于正常执行而发生控制转移,执行break,continue,goto或return语句,还是传播异常在try语句之外。

更多信息

MSDN - try-finally (C# Reference)

答案 2 :(得分:4)

即使finally块内有回复,也会执行catch

始终执行阻止

答案 3 :(得分:3)

finally将在退出catch块后执行(通过显式“return”)。但是,在 finally块之后的所有(在您的情况下为if (vm.Detail.Any()) ...)将执行。

答案 4 :(得分:2)

尽管catch块中有return语句,finally块中的代码仍会运行。 但是,我个人会将结果分配给变量并在块之后返回它。 但那只是品味问题。