在C#中静默失败,这不会崩溃的程序看似未处理异常(Silent failures in C#, se

2019-08-19 19:40发布

在WinForms应用程序,在窗体的Load事件,添加以下行:

throw new Exception();

并运行应用程序。 其运行没有任何问题。 这就是所谓的沉默的失败,你可以尝试之前和之后添加提示消息框,你会很快发现,而不是崩溃的应用程序,throw语句刚刚从Load事件退出。

我敢肯定,没有必要解释如何丑陋的和危险的,这是。

我在(可能是历史)这背后的可怕行为的原因仍然不知道。 我敢肯定,它不是一个设计决策,可能没有选择,或者懒惰。 有谁知道?

会很高兴,如果有人可以点我的事件列表可能会导致seilent失败了。

下面是我的代码片段 - 我不知道它如何帮助 - 但,那就是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Form f = new Form();
            f.Load += new EventHandler((x, y) => { throw new Exception(); });
            Application.Run(f);
        }

    }
}

编辑看来它并不happend给大家。 我使用:FW 3.5,的WinForms,VS 2008,Vista 64位,WinForms的新清洁工程,与上述代码。

Answer 1:

这是一个x64系统上已知的问题 :

这是在64位操作系统平台的已知问题。 其原因是,在64位操作系统内核不允许通过内核模式栈用户模式异常。 唯一的例外是由OS sliently吞噬。 这发生在FormLoad处理程序,因为它被称为在OS回调。 32位操作系统并没有这样做,所以也没有摄制那里。

操作系统团队正在调查相关问题。 在此同时,你就必须解决这个问题。 打开“停止在第一次机会异常”将使调试器停止在这种情况下。 但它确实使调试器停止非常频繁,所以你可能要当你发现一个问题,要做到这一点而已。

链接的错误报告最后更新2008年2月,并不表示自那以后发生了什么。

我可以重现最海报的行为我的32位系统就在这里,我可以复制我的64位(Vista SP2的,3.5SP1框架)的工作电脑的OP的行为。



文章来源: Silent failures in C#, seemingly unhandled exceptions that does not crash the program