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

时间:2008-09-27 04:38:50

标签: c++ windows mfc

如果从MFC对话框中抛出异常,即使代码中有catch块,应用程序也会挂起。它拒绝响应鼠标或键盘,关闭它的唯一方法是使用任务管理器。

为什么我发布此问题

令我遗憾的是,有一个流行的收缩包装应用程序,每次遇到模态对话框中的异常错误时都会挂起。当我们从整数错误代码大量转换到异常时,我负责选择std :: exception作为抛出异常的基类。直到大量的工作进入转换,我们的测试才发现了这个问题,到那时为时已经太晚了。希望这个问题/答案会让某人犯同样的错误。

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

Let there be hangs part 1 of 4

Let there be hangs part 2 of 4

Let there be hangs part 3 of 4

Let there be hangs part 4 of 4

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

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

答案 2 :(得分:1)

马克的回答是正确的。有关此问题的更严格分析以及在您自己的代码中处理此问题的详细建议,请参阅此FAQ by Doug Harrison(特别是第Q6节)。