我在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!");
}
答案 0 :(得分:6)
为了加载表单,您的代码将调用内核函数来创建表单窗口,此内核函数将通过发送调用您的OnLoad
方法的消息来回调您的代码。如果在该方法中引发异常,则异常处理机制将调用堆栈移回内核模式边界。
在x86上,异常可以通过此边界并返回到原始调用者。在x64上,当它到达边界时停止并且无法继续。在XP64和Vista中,异常被吞下(被忽略),而一个64位的应用程序与一个说明它是Win7兼容的清单会在发生这种情况时崩溃。要在64位Win7上获取其他操作系统或32位应用程序的崩溃行为,请参阅KB976038。
对于在x64上作为内核模式回调而调用的任何事件处理程序,都会发生此行为。