Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CLR中的Bug?CLR执行引擎失败_C#_C# 4.0_Clr - Fatal编程技术网

C# CLR中的Bug?CLR执行引擎失败

C# CLR中的Bug?CLR执行引擎失败,c#,c#-4.0,clr,C#,C# 4.0,Clr,好的,try和最后使用块执行一段可能引发一些异常的代码,如果我们准备处理某种类型的异常和/或正在排除它们,我们也会添加catch块,比如FileIOException,AccessRight或其他什么。但是当我运行这个 private void button1_Click(object sender, EventArgs e) { try { Environment.FailFast("It failed"); }

好的,
try
最后使用
块执行一段可能引发一些
异常的代码,如果我们准备处理某种类型的异常和/或正在排除它们,我们也会添加
catch
块,比如
FileIOException
AccessRight
或其他什么。但是当我运行这个

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

检测到FATAlexecutionEngineer错误
消息:运行时遇到致命错误。错误地址位于线程0xd04上的0x032526f4。错误代码为0x8013623。此错误可能是CLR或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括COM interop或PInvoke的用户封送错误,这可能会损坏堆栈。

现在说

通常,当未处理的异常结束应用程序时,无论 最后一个块是否运行并不重要。然而,如果你有 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时),情况肯定不是这样。评论/意见有人吗

这里还有快照


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