我正在为一个朋友检查一些代码,并说他在try-finally块中使用了return语句。即使try块的其余部分没有触发,Finally部分中的代码仍然会触发吗?

例子:

public bool someMethod()
{
  try
  {
    return true;
    throw new Exception("test"); // doesn't seem to get executed
  }
  finally
  {
    //code in question
  }
}

当前回答

最后不会运行的情况下,如果你正在退出应用程序使用 system . exit (0);就像在

try
{
    System.out.println("try");
    System.exit(0);
}
finally
{
   System.out.println("finally");
}

结果将是: 试一试

其他回答

最后不会运行的情况下,如果你正在退出应用程序使用 system . exit (0);就像在

try
{
    System.out.println("try");
    System.exit(0);
}
finally
{
   System.out.println("finally");
}

结果将是: 试一试

简单的回答:是的。

有一个非常重要的例外,我在其他任何答案中都没有看到过,而且(在用c#编程了18年之后)我不敢相信我不知道。

如果你在catch块中抛出或触发任何类型的异常(不仅仅是奇怪的stackoverflowexception和类似的东西),并且你没有在另一个try/catch块中包含整个try/catch/finally块,你的finally块将不会执行。这很容易证明-如果我没有自己看到它,考虑到我经常读到它只是非常奇怪的,微小的角落情况,可以导致finally块不执行,我不会相信它。

static void Main(string[] args)
{
    Console.WriteLine("Beginning demo of how finally clause doesn't get executed");
    try
    {
        Console.WriteLine("Inside try but before exception.");
        throw new Exception("Exception #1");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Inside catch for the exception '{ex.Message}' (before throwing another exception).");
        throw;
    }
    finally
    {
        Console.WriteLine("This never gets executed, and that seems very, very wrong.");
    }

    Console.WriteLine("This never gets executed, but I wasn't expecting it to."); 
    Console.ReadLine();
}

我相信这是有原因的,但奇怪的是,它并没有广为人知。(例如,这里提到了,但在这个特定的问题中没有提到。)

通常情况下,是的。finally部分保证执行发生的任何事情,包括异常或返回语句。该规则的异常是线程上发生的异步异常(OutOfMemoryException, StackOverflowException)。

要了解在这种情况下异步异常和可靠代码的更多信息,请阅读约束执行区域。

它也不会触发未捕获的异常,并运行在Windows服务托管的线程中

Finally在运行在Windows服务中的线程中不执行