3

AFAIKtryfinallyblock 用于执行一段可能会抛出一些异常的代码,如果我们准备处理某种类型的异常和/或正在排除它们exception,我们也会添加block,比如,或其他东西。但是当我运行这个..catchFileIOExceptionAccessRight

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

它打破了一个例外并说

检测到 FatalExecutionEngineError
消息:运行时遇到致命错误。错误地址位于线程 0xd04 上的 0x032526f4。错误代码为 0x80131623。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 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 说 finally 中的代码块总是运行(至少在添加 catch 时),肯定不是这样。评论/意见有人吗?

还有截图。。

在此处输入图像描述

4

1 回答 1

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,未处理的异常会终止应用程序。事实并非如此。该应用程序只是当场终止 - 没有未处理的异常。

于 2013-03-02T11:14:33.887 回答