在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的新清洁项目,以及上面提到的代码。
这是x64系统上的已知问题:
这是64位OS平台上的已知问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。异常被操作系统缓慢吞噬。这是在FormLoad处理程序中发生的,因为它是在OS回调中调用的。32位操作系统不会执行此操作,因此不会在那里复制。 操作系统团队正在调查相关问题。同时,您必须解决此问题。启用“在第一次机会异常时停止”将使调试器在这种情况下停止。但这确实会使调试器非常频繁地停止,因此您可能只想在发现问题时才这样做。
这是64位OS平台上的已知问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。异常被操作系统缓慢吞噬。这是在FormLoad处理程序中发生的,因为它是在OS回调中调用的。32位操作系统不会执行此操作,因此不会在那里复制。
操作系统团队正在调查相关问题。同时,您必须解决此问题。启用“在第一次机会异常时停止”将使调试器在这种情况下停止。但这确实会使调试器非常频繁地停止,因此您可能只想在发现问题时才这样做。
链接的错误报告的最新更新时间为2008年2月,但未显示此后发生的情况。
在这里,我可以在32位系统上重现大多数海报的行为,并且可以在64位(Vista SP2、3.5SP1 Framework)工作PC上重现OP的行为。