一尘不染

C#中的无提示故障,看似未处理的异常,不会使程序崩溃

c#

在winforms应用中,在窗体的Load事件中,添加以下行:

throw new Exception();

并运行该应用程序。它运行没有问题。这称为静默故障,您可以尝试在前后添加消息框,并且您很快就会发现,throw语句只是从Load事件中退出,而不是使应用程序崩溃。

我敢肯定没有必要解释这是多么的丑陋和危险。

尽管如此,我仍想知道这种可怕行为背后的原因(可能是历史原因)。我确定这不是设计决定,可能不是选择还是懒惰。有人知道吗

如果有人可以将我指向可能也会导致严重失败的事件列表,我们将非常高兴。

这是我的代码的一部分-我不知道它可能有什么帮助-但是,这里是:

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);
        }

    }
}

编辑 似乎并不是每个人都发生过。我使用:fw 3.5,winforms,vs 2008,vista
x64,winforms的新清洁项目,以及上面提到的代码。


阅读 301

收藏
2020-05-19

共1个答案

一尘不染

这是x64系统上已知问题

这是64位OS平台上的已知问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。异常被操作系统缓慢吞噬。这是在FormLoad处理程序中发生的,因为它是在OS回调中调用的。32位操作系统不会执行此操作,因此不会在那里复制。

操作系统团队正在调查相关问题。同时,您必须解决此问题。启用“在第一次机会异常时停止”将使调试器在这种情况下停止。但这确实会使调试器非常频繁地停止,因此您可能只想在发现问题时才这样做。

链接的错误报告的最新更新时间为2008年2月,但未显示此后发生的情况。

在这里,我可以在32位系统上重现大多数海报的行为,并且可以在64位(Vista SP2、3.5SP1 Framework)工作PC上重现OP的行为。

2020-05-19