为什么抛出异常时我的MFC应用程序挂起?
时间:2020-03-06 14:49:07 来源:igfitidea点击:
如果从MFC对话框中引发异常,即使代码中包含catch块,应用程序也会挂起。它拒绝响应鼠标或者键盘,并且关闭它的唯一方法是使用任务管理器。
为什么我要发布此问题
令我感到羞耻的是,有一个流行的收缩包装应用程序,每次在模式对话框中遇到异常错误时,该应用程序便会挂起。当我们从整数错误代码到异常进行大规模转换时,我负责选择std :: exception作为引发异常的基类。直到大量的工作进行了转换,我们的测试才发现了这个问题,到那时为时已晚。希望这个问题/答案可以使某人避免犯同样的错误。
解决方案
CDialog :: DoModal的代码通过禁用父窗口使对话框成为模态。当对话框代码返回时,将重新启用该窗口。对于CException *错误有一个明确的捕获,但对于其他引发的异常则没有。因此父窗口永远不会重新启用。
更改代码以将指针指向从CException派生的任何异常,然后我们将解决问题。
如果我们有兴趣了解Windows如何检测到Apphang,我们在Windows错误报告博客上为此添加了一些帖子:
让挂起4的第1部分
让挂起4的第2部分
让挂起4的第3部分
让挂起4的第4部分
需要注意的重要一点是,通过Microsoft的Windows错误报告发送的此信息会与软件开发人员进行通信,以尝试解决这些问题。如果我们要发送错误报告,则将解决PC上出现的问题!
我是Windows错误报告团队的Microsoft程序经理。
马克的答案是正确的。有关此问题的更严格分析以及在我们自己的代码中处理该问题的详细建议,请参阅Doug Harrison(尤其是第6节)的FAQ。