首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLR中的窃听器?CLR执行引擎失败

CLR中的窃听器?CLR执行引擎失败
EN

Stack Overflow用户
提问于 2013-03-02 11:11:24
回答 1查看 2.8K关注 0票数 3

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

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        finally
        {
            MessageBox.Show("Done");
        }
    }

它打破了一个例外,说

FatalExecutionEngineError检测到

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

现在msdn

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

因此,我添加了catch块,但它仍然是一样的。

代码语言:javascript
复制
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            Environment.FailFast("It failed");
        }
        catch (Exception ex)
        {

        }
        finally
        {
            MessageBox.Show("Done");
        }
    }

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

这是快照..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-02 11:14:33

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

文档说:

此方法终止进程而不运行任何活动的尝试/最后块或终结器。 FailFast方法将消息字符串写入日志,创建应用程序的转储,然后终止当前进程。在向Microsoft报告错误时还包含了messa字符串。 如果应用程序的状态损坏无法修复,则使用FailFast方法而不是Exit方法终止应用程序,执行应用程序的try/finally块和终结器将破坏程序资源。

这清楚地表明,最终块中的代码将不会运行。如果有一种使代码在Environment.FailFast之后运行的方法,那么这将使Environment.FailFast变得非常无用。它的存在是基于这样一个事实:您的代码在您调用它之后不执行。

您可以参考那些声明(强调我的)的文档:

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

但这些话在这里根本不适用。您假设在调用Environment.FailFast时,未处理的异常将终止应用程序。情况并非如此。应用程序只是当场终止-没有未处理的异常。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15173774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档