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

C#中的无声故障,看似未处理的异常,不会使程序崩溃,c#,winforms,64-bit,exception,C#,Winforms,64 Bit,Exception,在winforms应用程序中,在窗体的加载事件中,添加以下行: throw new Exception(); 然后运行应用程序。它运行起来没有问题。这称为静默故障,您可以尝试在前后添加MessageBox,很快您就会发现,throw语句不会使应用程序崩溃,而是从Load事件中退出 我相信没有必要解释这是多么丑陋和危险 尽管如此,我还是想知道(可能是历史上)这种可怕行为背后的原因。 我确信这不是一个设计决定,可能是没有选择,或者是懒惰。有人知道吗 如果有人能给我指一份可能导致seilent失败的

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

throw new Exception();
然后运行应用程序。它运行起来没有问题。这称为静默故障,您可以尝试在前后添加MessageBox,很快您就会发现,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);
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Windows.Forms;
命名空间Windows窗体应用程序1
{
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
表格f=新表格();
f、 Load+=neweventhandler((x,y)=>{throw new Exception();});
应用程序。运行(f);
}
}
}
编辑 似乎不是每个人都会这样。 我使用:fw 3.5,winforms,vs 2008,vista x64,winforms的新clean项目,使用上面提到的代码。

这是一个:

这是64位操作系统上的一个已知问题 站台原因是64位 操作系统内核不允许用户模式 通过内核模式堆栈的异常。 这个异常被操作系统吞并了 安静地。这在FormLoad中发生 处理程序,因为它是在操作系统中调用的 回拨。32位操作系统不能做到这一点, 所以它不会在那里重新编程

操作系统团队正在调查相关问题 问题。同时,你也有 来解决这个问题。打开 “第一次机会例外时停止”将 使调试器在此状态下停止 脚本但它确实让人感到 调试器经常停止,所以 可能只想在您 找到一个问题

链接的bug报告上一次更新是在2008年2月,并没有说明此后发生了什么


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

你能用表单的OnLoad事件处理程序中的一个片段进一步解释你的问题吗。此外,您在此应用程序域中是否有未处理的异常处理程序?如果这是应用程序的主要形式,并且由于您抛出了未处理的异常而无法加载,那么您预期会发生什么情况?我怀疑在这种情况下会调用您的未处理事件处理程序。您使用的是什么版本的windows?我实际上再次否决了您的上一个问题,它写得很糟糕,而且很傲慢…您的问题在这里没有得到回答:非常感谢。。我还记得x86也发生过这种情况,但我不太确定。。我会查出来的。有趣的是,当我运行Windows 7 x64计算机而不进行调试时,这个异常不会被忽略,但当我进行调试时,它会被忽略。@FacticiusVir:这里完全相同。在我的Win7 x64上,只有在VS调试模式下,它才会被吞没。有一个API允许您修复此问题。有关如何在C#中使用它,请参见。