10

我有以下代码片段/示例。它不是工作代码我只是写了这个,以便提出一个关于 catch 的问题,finally 并返回:

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 语句,那么 finally 会被执行吗?这是编写 catch 和 finally 的正确方法吗?

4

5 回答 5

14

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

参考:试一试

于 2012-08-28T09:38:31.273 回答
10

是的finally,即使你return以前做过什么,也会被执行。

finally 块可用于清理在 try 块中分配的任何资源,以及运行任何必须执行的代码,即使在 try 块中发生异常也是如此。通常,finally 块的语句在控制离开 try 语句时执行,无论控制转移是由于正常执行、执行 break、continue、goto 或 return 语句,还是传播异常而发生出 try 语句。

更多信息

MSDN - try-finally(C# 参考)

于 2012-08-28T09:37:59.427 回答
4

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

finally 块总是被执行

于 2012-08-28T09:38:07.023 回答
3

finally在 catch-block 退出后执行(在你的通过显式“return”的方式)。但是,finally-block之后if (vm.Detail.Any()) ...的所有内容(在您的情况下为)都不会执行。

于 2012-08-28T09:38:47.440 回答
2

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

于 2012-08-28T09:40:26.260 回答