Meh*_*ari 27

finally大部分时间都在执行.这几乎是所有情况.举例来说,如果一个异步除外(例如StackOverflowException,OutOfMemoryException,ThreadAbortException)是线程抛出,finally执行不保证.这就是存在用于编写高度可靠代码的受约束执行区的原因.

对于面试目的,我希望这个问题的答案是错误的(我不保证任何事情!面试官可能不会自己知道!).

  • 另外不要忘记更常见的情况,因为电源耗尽,硬件故障,操作系统终止进程等等.如果你写完一个敏感文件并且操作系统杀了你,finally块不会救你. (7认同)

Bri*_*sen 8

通常,finally块保证执行.

但是,少数情况会在发生错误时强制CLR关闭.在这些情况下,finally块不会运行.

一个这样的例子是存在StackOverflow异常.

例如,在下面的代码中,finally不执行块.

static void Main(string[] args) {
   try {
      Foo(1);
   } catch {
      Console.WriteLine("catch");
   } finally {
      Console.WriteLine("finally");
   }
}

public static int Foo(int i) {
   return Foo(i + 1);
}
Run Code Online (Sandbox Code Playgroud)

我知道的另一种情况是终结器抛出异常.在这种情况下,该过程也会立即终止,因此保证不适用.

下面的代码说明了这个问题

static void Main(string[] args) {
   try {
      DisposableType d = new DisposableType();
      d.Dispose();
      d = null;
      GC.Collect();
      GC.WaitForPendingFinalizers();
   } catch {
      Console.WriteLine("catch");
   } finally {
      Console.WriteLine("finally");
   }
}

public class DisposableType : IDisposable {
   public void Dispose() {
   }

   ~DisposableType() {
      throw new NotImplementedException();
   }
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,都处理之前终止catchfinally.

我承认这些例子非常人为,但它们只是为了说明这一点.

幸运的是,这种情况经常发生.


Joh*_*n T 7

直接来自MSDN:

finally块对于清理try块中分配的任何资源非常有用.无论try块如何退出,控制总是传递给finally块.

catch用于处理语句块中发生的异常,而最终用于保证语句代码块的执行,而不管前面的try块是如何退出的.

http://msdn.microsoft.com/en-us/library/zwc8s4fz(VS.71,loband).aspx

  • 并非总是如此...... MSDN并非总是如此.同样来自MSDN:http://msdn.microsoft.com/en-us/magazine/cc163716.aspx http://msdn.microsoft.com/en-us/library/ms228973.aspx出于面试问题的目的,我希望"不"作为答案. (2认同)

归档时间:

查看次数:

10792 次

最近记录:

16 年,4 月 前