CLR中的错误?CLR执行引擎失败

Raz*_*t4x 3 c# clr c#-4.0

据我所知,tryfinally块是用来执行一段代码可能抛出一些exception,我们还加catch块,如果我们准备处理一些异常类型和/或在它们以外,像FileIOException,AccessRight或什么的.但是当我跑这个..

private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        finally
        {
            MessageBox.Show("Done");
        }
    }
Run Code Online (Sandbox Code Playgroud)

它打破了一个例外并说

检测到FatalExecutionEngineError
消息:运行时遇到致命错误.错误的地址位于线程0xd04处的0x032526f4处.错误代码是0x80131623.此错误可能是CLR中的错误,也可能是用户代码的不安全或不可验证部分中的错误.此错误的常见来源包括COM-interop或PInvoke的用户编组错误,这可能会破坏堆栈.

现在msdn

通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要.但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是在try-finally语句中添加一个catch块.

所以,我添加了catch块,但它仍然说同样的事情.

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        catch (Exception ex)
        {

        }
        finally
        {
            MessageBox.Show("Done");
        }
    }
Run Code Online (Sandbox Code Playgroud)

它再次失败并出现同样的错误.至于CLR说最终总是运行代码块(至少在添加catch时),情况肯定不是这样.评论/意见谁?

还有这里的快照..

在此输入图像描述

Dav*_*nan 7

这是设计的.目的Environment.FailFast是立即停止执行.通过设计,它不会在catch或finally块中运行任何代码.

文件说:

此方法终止进程而不运行任何活动的try/finally块或终结器.

FailFast方法将消息字符串写入Windows应用程序事件日志,创建应用程序的转储,然后终止当前进程.Messa字符串也包含在向Microsoft的错误报告中.

如果应用程序的状态损坏无法修复,则使用FailFast方法而不是Exit方法终止应用程序,并且执行应用程序的try/finally块和终结器将损坏程序资源.

这清楚表明finally块中的代码不会运行.如果有一种方法可以让代码在Environment.FailFast那之后运行,那将会变得Environment.FailFast毫无用处.它的存在是基于您调用它后代码不执行的事实.

你指出的文件(强调我的):

通常,当未处理的异常结束应用程序时,无论finally块是否运行都不重要.但是,如果在finally块中有语句,即使在这种情况下也必须运行,一种解决方案是在try-finally语句中添加一个catch块.

但这些话根本不适用于此.您假设在调用时Environment.FailFast,未处理的异常终止了应用程序.事实并非如此.该应用程序刚刚在现场终止 - 没有未处理的异常.