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

更新:

如果我像这样更改代码:

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

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

它首先打印消息然后崩溃。

我的想法是如果应用程序一开始崩溃,是否可以随心所欲地处理它?

我知道这很简单,但我真的要学习更多。

4

5 回答 5

11

你有一个未处理的异常。当您有未处理的异常时,程序行为取决于实现

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

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

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

于 2011-07-09T14:57:07.520 回答
10

它确实打印Execute Dispose!在窗口上。你应该仔细看看。

于 2011-07-08T21:58:22.267 回答
5

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

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

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

但它仅在您关闭“应用程序已停止工作窗口”后才会显示

于 2011-07-08T21:59:01.250 回答
2

它确实被打印出来了。也许“应用程序已停止工作”的异常会阻止您看到它。单击取消并查看打印的消息。

截屏:

在此处输入图像描述

于 2011-07-08T22:01:00.967 回答
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();
    }
}
于 2011-07-09T16:07:02.473 回答