为什么我的MFC应用程序在我抛出exception时挂起?

如果从MFC对话框中抛出exception,即使您的代码中有一个catch块,该应用也会挂起。 它拒绝响应鼠标或键盘,closures它的唯一方法是使用任务pipe理器。

为什么我发布这个问题

令我惭愧的是,有一个stream行的缩小封装的应用程序每当遇到modal dialog中的特殊错误时都会挂起。 当我们从整数错误代码转换为exception时,我负责selectstd :: exception作为抛出exception的基类。 直到大量的工作进入转换,我们的testing发现了这个问题,到那时改变为时已晚。 希望这个问题/答案可以防止某人犯同样的错误。

CDialog :: DoModal的代码通过禁用父窗口来生成对话框模式。 当对话框代码返回时,窗口被重新启用。 有一个显式的CException *错误捕获,但不是任何其他类型的抛出异常; 从而父窗口永远不会被重新启用。

更改您的代码以抛出从CException派生的任何异常的指针,然后解决问题。

如果您有兴趣了解Windows如何检测apphangs,我们在Windows错误报告博客上添加了一些文章:

让悬挂在4的第一部分

让悬挂在4的第2部分

让悬挂在4的第3部分

让悬挂在4的第4部分

需要注意的是,通过Microsoft Windows错误报告发送的这些信息会传达给软件开发人员,尝试解决这些问题。 如果您发送错误报告,您将帮助解决在您的PC上发生的问题!

我是Windows错误报告团队的Microsoft项目经理。

马克的回答是正确的。 对于这个问题的更为严格的分析以及在你自己的代码中处理这个问题的详细建议,请看Doug Harrison的这个FAQ (特别是Q6)。