为什么当我抛出异常时,我的MFC应用程序会挂起?

5
如果你在MFC对话框中抛出异常,即使你的代码中有catch块,应用程序也会挂起。它拒绝响应鼠标或键盘,唯一关闭它的方法是使用任务管理器。
我发布这个问题的原因是,有一个流行的封装应用程序每次遇到模态对话框中的异常错误都会挂起。当我们从整数错误代码转向异常时,我负责选择std :: exception作为抛出异常的基类。直到大量工作投入到转换中,我们的测试才发现了这个问题,但那时已经太晚了无法更改。希望这个问题/答案能防止别人犯同样的错误。
3个回答

9

CDialog::DoModal的代码通过禁用父窗口使对话框模态。当对话框代码返回时,窗口将被重新启用。对于CException*错误,有一个明确的catch,但没有为任何其他类型的抛出异常提供捕获;因此,父窗口永远不会被重新启用。

将您的代码更改为抛出从CException派生的任何异常指针,即可解决问题。


3
如果你想了解Windows如何检测应用程序挂起,我们在Windows错误报告博客上添加了一些帖子:

让应用程序挂起(第1部分)

让应用程序挂起(第2部分)

让应用程序挂起(第3部分)

让应用程序挂起(第4部分)

重要的是要注意,当这些信息通过微软的Windows错误报告发送时,会传达给软件开发人员,以尝试解决这些问题。如果您发送错误报告,您将有助于解决在您的PC上出现的问题!我是Windows错误报告团队的微软程序经理。

谢谢,这些链接非常有趣。 - Mark Ransom

1

Mark的答案是正确的。如果你想对这个问题进行更严谨的分析,并得到如何在你自己的代码中处理它的详细建议,请参考Doug Harrison的FAQ(特别是第6节)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接