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

she*_*bin 2 c# finally unhandled-exception

我有以下代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它不会打印Execute Dispose!消息,为什么会这样?

更新:

如果我像这样更改了代码:

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

    try
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            sc.Dispose();
        }
    }
    catch
    {
        throw;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

我知道这很简单,但我真的要学到更多东西.

Eri*_*ert 11

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

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

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

如果您不喜欢这种行为,那么您的选择是阻止处理异常,或者获得运行时的不同实现,以便更好地执行您喜欢的操作.


mqp*_*mqp 10

它会Execute Dispose!在窗口上打印.你应该仔细看看.


Cod*_*aos 5

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

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

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

但它只显示一旦你关闭"应用程序已停止工作窗口"