C#中的静默失败,看似未处理的exception不会使程序崩溃
在Winforms应用程序中,在窗体的Load事件中,添加以下行:
throw new Exception();
并运行该应用程序。 它运行没有问题。 这被称为无声故障,您可以尝试在之前和之后添加消息框,并且很快您会发现,不是崩溃应用程序,而是从Load事件中退出throw语句。
我相信没有必要解释这是多么的丑陋和危险。
尽pipe如此,我仍然怀疑这种恐怖行为背后的原因。 我相信这不是一个devise决定,可能是不择手段,或者懒惰。 有人知道吗?
如果有人能指出我可能导致静音故障的事件列表,我会很高兴。
这是我的代码片段 – 我不知道它可能会有什么帮助 – 但是,在这里是:
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); } } }
编辑它似乎并没有发生给大家。 我用的是:3.5,winforms,vs 2008,vista x64,winforms的新干净的项目,用上面提到的代码。
这是x64系统上的一个已知问题 :
这是64位操作系统平台上的一个已知问题。 原因是64位操作系统内核不允许通过核心模式堆栈的用户模式exception。 这个例外被操作系统吞噬了。 这发生在FormLoad处理程序中,因为它在OScallback中被调用。 32位操作系统不这样做,所以它不repro在那里。
操作系统小组正在调查相关问题。 同时,你必须解决这个问题。 打开“一次性exception停止”将使debugging器停止在这种情况下。 但它确实使debugging器经常停止,因此只有在发现问题时才可以这样做。
链接的错误报告是在2008年2月更新的,并没有说明自那时以来发生了什么。
我可以在这里重现我的32位系统上大多数海报的行为,并且可以在64位(Vista SP2,3.5SP1 Framework)工作PC上重现OP的行为。