为什么不在这种情况下最终执行?

时间:2011-07-08 21:55:59

标签: c# unhandled-exception finally

我有以下代码:

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!消息,为什么会这样?

更新

如果我改变了代码:

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

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

首先打印消息然后崩溃。

我的想法是,如果应用程序崩溃,可以随意处置吗?

我知道这很简单,但我真的要了解更多。

5 个答案:

答案 0 :(得分:11)

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

正如您所发现的,在您的特定实现中,未处理的异常首先会询问您是否要调试未处理的异常(或在控制台上输出异常),然后然后< / em>运行finally块。

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

如果你不喜欢这种行为,那么你的选择是阻止处理异常,或者获得运行时的不同实现,做你喜欢的事情更好。

答案 1 :(得分:10)

它会在窗口上打印Execute Dispose!。你应该仔细观察。

答案 2 :(得分:5)

它在我的测试中执行(LinqPad)。

作为普通的控制台应用程序,消息出现在异常消息之后。

  

未处理的异常:System.Exception:'System.Exception'类型的异常   抛出。
     在D:... \ Program中的OutputTest.Program.Main(String [] args)   .cs:第27行   执行处理!
  按任意键继续 。 。

但只有在你关闭“App已停止工作窗口”

时才会显示

答案 3 :(得分:2)

确实打印出来了。也许说“应用程序已停止工作”的例外情况阻止您看到它。单击取消并查看打印的消息。

截图:

enter image description here

答案 4 :(得分: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();
    }
}