2011-07-08 82 views
2

我有以下代码:为什么不在这种情况下最终执行?

class SampleClass : IDisposable 
{ 

    public void Dispose() 
    { 
     Console.WriteLine("Execute Dispose!"); 
    } 
} 

static void Main(string[] args) 
{ 
    SampleClass sc = new SampleClass(); 

    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     sc.Dispose(); 
    } 
} 

然而,当我运行这个它不打印Execute Dispose!消息,这是为什么?

UPDATE:

如果我改变,像这样的代码:

static void Main(string[] args) 
{ 
    SampleClass sc = new SampleClass(); 

    try 
    { 
     try 
     { 
      throw new Exception(); 
     } 
     finally 
     { 
      sc.Dispose(); 
     } 
    } 
    catch 
    { 
     throw; 
    } 
} 

它输出消息第一,然后崩溃。

我想的是如果在第一个应用程序崩溃能不能和你喜欢的配置?

我知道这很简单,但我真的什么了解更多信息。

+0

我不明白,所有的downvotes,这是一个很好的问题,我学到新的东西从它。 – Justin

回答

11

您有未处理的异常。 当您有未处理的异常时,程序行为依赖于实现。

正如你已经发现,在具体实现中未处理的异常第一询问您是否要调试的未处理的异常(或将异常出在控制台上),并然后运行finally块。

请注意,当存在未处理的异常时,不保证finally块运行。如果它认为适合这样做,则允许实现在未处理的异常时立即终止进程。

如果你不喜欢这种行为那么你的选择是要么防止手柄异常,或让不同的实现,做你喜欢的东西更好地运行的。

10

它确实在窗户上打印Execute Dispose!。你应该仔细观察。

5

它得到我的测试(LinqPad)执行。

作为正常控制台应用程序的消息出现异常消息之后。

未处理的异常:System.Exception:引发类型为“System.Exception”的异常为 。
at D中的OutputTest.Program.Main(String [] args)... \ Program .cs:line 27
Execute Dispose!
按任意键继续。 。 。

但它只能说明,一旦你关闭

2

它得到打印的“应用程序已停止工作窗口”。也许说“应用程序已停止工作”的异常阻止您看到它。点击取消并查看打印的消息。

截图:

enter image description here

0

和其他人一样,代码确实有效。您可能需要使用using构造,但(你可以使用,如果类实现了IDisposable)

class SampleClass : IDisposable { 
    public void Dispose() { 
     Console.WriteLine("Execute Dispose!"); 
    } 
} 

static void Main(string[] args) { 
    using (SampleClass sc = new SampleClass()) { 
     throw new Exception(); 
    } 
} 
相关问题