是什么阻止了异常被抓住?

时间:2011-11-11 04:53:59

标签: c++ winapi

我有一个在VS2005中开发的Win32 C ++应用程序。有一个try {} catch(...){}包含在一个代码块中,但是当算法出现故障并尝试引用std :: vector的末尾而不是捕获例外,该程序进入VS调试器,告诉我我有一个未处理的win32异常,并在我的函数上方的调用堆栈上找到以下内容:

msvcr80.dll!:inavlid_parameter_noinfo()
msvcr80.dll!:invoke_watson(....)
msvcr80.dll!:_crt_debugger_hook(...)

如何阻止调用调用程序?这发生在30分钟模拟结束时,此时我丢失了所有结果,除非我能捕获并记录异常。这个和类似的try / catch构造过去一直在工作 - 有编译器设置会影响这个吗?帮助

4 个答案:

答案 0 :(得分:2)

您可能希望将非C ++异常转换为C ++异常。 Here是如何做到这一点的一个例子。

答案 1 :(得分:0)

标准库容器不检查任何逻辑错误,因此它们自己不会发出任何异常。

具体来说,对于std::vector,仅抛出异常的方法是std::vector::at() 对他们来说,任何未定义的行为都很可能导致程序崩溃。

您需要使用Windows的SEH和C ++异常处理来捕获Windows特定的异常,这些异常是非C ++标准的。

答案 2 :(得分:0)

仅仅因为你有一个catch(...)并不意味着你可以捕获并从所有异常中恢复。并非所有例外都是可以恢复的。

你的问题可能是引脚指出确切问题的第一个例外是被你的catch语句遮挡了

您需要将调试器附加到程序中,并使其中断所有异常并修复代码

答案 3 :(得分:0)

对延迟道歉 - 不可预见的情况 - 但真正的答案似乎如下。

首先,应用程序也包含在__try {} __except(){}构造中,并使用基于XCrashReport的未处理异常过滤。由于上面许多人已经指出的原因,这会引发非C ++异常。

然而,第二,因为人们可以找到here和其他地方,因为CRT 8.0,出于安全原因,微软绕过缓冲区溢出(以及某些其他情况)的未处理异常处理,并将问题直接传递给Dr Watson。

这真的很烦人 - 我想知道我的缓冲区溢出在哪里,为什么,以及修复它们。我还希望我的程序崩溃,留下审计跟踪,然后自动重启,全天候。在PC上安装MS Visual Studio似乎意味着Watson博士会暂停并为我提供使用MSVC来调试问题的选项。但是,在我回复对话框之前,什么都不会发生。对变通方法的评论非常感谢...