如果从MFC对话框中抛出异常,即使代码中有catch块,应用程序也会挂起。它拒绝响应鼠标或键盘,关闭它的唯一方法是使用任务管理器。
令我遗憾的是,有一个流行的收缩包装应用程序,每次遇到模态对话框中的异常错误时都会挂起。当我们从整数错误代码大量转换到异常时,我负责选择std :: exception作为抛出异常的基类。直到大量的工作进入转换,我们的测试才发现了这个问题,到那时为时已经太晚了。希望这个问题/答案会让某人犯同样的错误。
答案 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)