2012-03-23 47 views
5

我写了一个简单的程序来测试一个理论,即“finally”块将总是执行,无论如何。 但是,我从下面的pgm看到的是,控制似乎永远不会进入外部的finaly块。当内部“catch”抛出时,为什么外层“finally”没有被执行?

我试图做F5和Ctrl-F5在Visual Studio中,它是相同的结果。

有人可以解释为什么我看到这种行为?

输出控制台窗口上是:

内抓住

内最后

外抓

未处理exeption:

..和然后应用程序崩溃

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      try 
      { 
       string s = null; 
       s.ToString(); 
      } 
      catch 
      { 
       Console.WriteLine("inner catch"); 
       throw; 
      } 
      finally 
      { 
       Console.WriteLine("inner finally"); 
      } 

      return; 
     } 
     catch 
     { 
      Console.WriteLine("outer catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("outer finally"); 
     } 
    } 
} 

回答

7

“异常终止”在异常处理后运行。

以下是运行调试器之外这段代码的输出:

 
inner catch 
inner finally 
outer catch 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 
jects\SO\SOConsole\Program.cs:line 35 
outer finally 
Press any key to continue . . . 

当发生异常会显示以下: Exception

后,我点击“取消”,应用恢复,显示“外面的最后”。

如果由于某种原因,在您有机会进入“outer finally”之前关闭了应用程序,那么您将永远不会看到您的消息。如果一个应用程序的进程被“终止”,那么终端将被跳过,以防它们包含阻止应用程序关闭的代码。否则,可能无法终止该过程。

+0

哦,好的。点击取消确实会使“外部终于:声明”显示出来,很高兴知道这一点,谢谢 – user330612 2012-03-23 01:07:25

4

该应用程序很可能在之前终止stdout缓冲区被刷新。

无论是添加一个断点到最后(在WriteLine)或抛出一个不同的异常从外最后确认。 A finally不是跳过:这样做会是一个严重的错误!

+1

+1或在最后做一个自检。 – Craig 2012-03-23 00:56:27

相关问题