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

时间:2013-03-02 11:11:25

标签: c# c#-4.0 clr

使用AFAIK,tryfinally块执行一段可能会抛出一些exception的代码,如果我们准备处理某些代码,我们还会添加catch块异常类型和/或除外,例如FileIOExceptionAccessRight或其他内容。但当我跑这个..

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

它打破一个例外并说

检测到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");
        }
    }

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

这里也是快照..

enter image description here

1 个答案:

答案 0 :(得分:7)

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

documentation说:

  

此方法终止进程而不运行任何活动进程   尝试/终止块或终结器。

     

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

     

使用FailFast方法而不是Exit方法来终止你的   申请状态如果损坏无法修复,   并执行您的应用程序的try / finally块和终结器   将破坏计划资源。

这清楚表明finally块中的代码不会运行。如果有一种方法可以在Environment.FailFast之后运行代码,那么会导致Environment.FailFast几乎没用。它的存在是基于你的代码在调用之后不执行的事实。

你指的是陈述的文件(强调我的):

  

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

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