我正在为一个朋友检查一些代码,并说他在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
  }
}

当前回答

是的。这实际上是最后一个陈述的主要观点。除非发生了一些灾难性的事情(内存不足,计算机拔插等),finally语句应该始终执行。

其他回答

引用自MSDN

Finally用于保证执行语句代码块,而不管前面的try块是如何退出的。

finally块的主要目的是执行写入其中的内容。它不应该取决于try或catch中发生的任何事情。但是使用System.Environment.Exit(1),应用程序将退出而不移动到下一行代码。

99%的情况下,finally块内的代码将会运行,但是,想想这个场景:你有一个线程,它有一个try->finally块(没有catch),你在该线程中得到一个未处理的异常。在这种情况下,线程将退出,它的finally块将不会执行(在这种情况下,应用程序可以继续运行)。

这种情况非常罕见,但这只是为了表明答案并不总是“是”,大多数情况下是“是”,有时在极少数情况下是“否”。

是的。这实际上是最后一个陈述的主要观点。除非发生了一些灾难性的事情(内存不足,计算机拔插等),finally语句应该始终执行。

这里有一个小测试:

class Class1
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine("before");
        Console.WriteLine(test());
        Console.WriteLine("after");
    }

    static string test()
    {
        try
        {
            return "return";
        }
        finally
        {
            Console.WriteLine("finally");
        }
    }
}

结果是:

before
finally
return
after