无声的例外,

时间:2010-12-21 07:36:45

标签: c# exception-handling 64-bit

我在64位遇到了这个奇怪的静默异常问题。 这是什么造成这种行为? 我想了解为什么会出现这种情况以及推荐的解决方案是什么?

主要:

    try
    {
        Application.Run(new Form1());
    }
    catch
        (Exception ex)
    {
        MessageBox.Show("Error");
    }

private void Form1_Load(object sender, EventArgs e)
{
    throw new Exception("oh no!");
}

1 个答案:

答案 0 :(得分:6)

为了加载表单,您的代码将调用内核函数来创建表单窗口,此内核函数将通过发送调用您的OnLoad方法的消息来回调您的代码。如果在该方法中引发异常,则异常处理机制将调用堆栈移回内核模式边界。

在x86上,异常可以通过此边界并返回到原始调用者。在x64上,当它到达边界时停止并且无法继续。在XP64和Vista中,异常被吞下(被忽略),而一个64位的应用程序与一个说明它是Win7兼容的清单会在发生这种情况时崩溃。要在64位Win7上获取其他操作系统或32位应用程序的崩溃行为,请参阅KB976038

对于在x64上作为内核模式回调而调用的任何事件处理程序,都会发生此行为。