Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当我抛出异常时,为什么我的MFC应用程序挂起?_C++_Windows_Mfc - Fatal编程技术网

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

C++ 当我抛出异常时,为什么我的MFC应用程序挂起?,c++,windows,mfc,C++,Windows,Mfc,如果从MFC对话框中抛出异常,即使代码中有catch块,应用程序也会挂起。它拒绝响应鼠标或键盘,关闭它的唯一方法是使用任务管理器 为什么我要发布这个问题 让我感到羞耻的是,有一个流行的收缩包装应用程序,每当它在模式对话框中遇到异常错误时就会挂起。当我们从整数错误代码大量转换为异常时,我负责选择std::exception作为抛出异常的基类。直到大量的工作投入到转换中,我们的测试才发现这个问题,到那时改变已经太晚了。希望这个问题/答案能防止有人犯同样的错误。CDialog::DoModal的代码通

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

为什么我要发布这个问题
让我感到羞耻的是,有一个流行的收缩包装应用程序,每当它在模式对话框中遇到异常错误时就会挂起。当我们从整数错误代码大量转换为异常时,我负责选择std::exception作为抛出异常的基类。直到大量的工作投入到转换中,我们的测试才发现这个问题,到那时改变已经太晚了。希望这个问题/答案能防止有人犯同样的错误。

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


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

如果您有兴趣了解Windows如何检测应用程序挂起,我们已在Windows错误报告博客上对此添加了一些帖子:

需要注意的重要一点是,当通过Microsoft的Windows错误报告发送此信息时,会将其传达给软件开发人员,以尝试解决这些问题。如果您发送错误报告,您将帮助修复电脑上出现的问题


我是微软Windows错误报告团队的程序经理

马克的答案是正确的。有关此问题的更严格的分析以及在自己的代码中处理此问题的详细建议,请参见此部分(特别是Q6部分)。

谢谢-这些链接非常有趣。