沉默的例外,

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

  • 消失的OnLoadexception
  • 微软 – 沉默的例外
  • KB976038

在主要:

try { Application.Run(new Form1()); } catch (Exception ex) { MessageBox.Show("Error"); } private void Form1_Load(object sender, EventArgs e) { throw new Exception("oh no!"); } 

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

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

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