MS Visual Studio 2005 c++异常处理
MS Visual Studio 2005 C++ exception handling
我有一个内置在MS Visual Studio 2005中的c++应用程序,它可以链接到第三方库。对于某个输入,应用程序在第三方库中崩溃(显然在reallocc .c中的某个地方;所以一定是某种记忆问题)。我在release中运行,因为输入量很大。所以我一直运行,直到它崩溃,然后选择调试。当我单独调试错误函数时,我希望使用一些异常处理来防止应用程序崩溃,而不是干净地退出。所以我用的是:
try {
//- call 3rd party application function that fails
}
catch(...) {
//- handle exception or whatever
Logger::Fatal("Fatal error: Exiting...");
return false;
}
但令我惊讶的是,应用程序仍然崩溃!我希望看到它显示错误消息,因为我可能已经用省略号(…)捕获了所有异常;我错过了什么?我甚至尝试在项目属性-> C/c++ ->代码配置->启用异常处理中设置/EHca (was/EHsc)。关于可能导致问题的原因的相关说明是,以下用法正确吗?
my_class* mc[] = {nil, nil, nil};
for (int i = 0; i < 3; ++i) {
mc[i] = new my_class();
//-Do stuff with mc[i]
if (mc[i] != nil) {
delete mc[i];
mc[i] = nil;
}
}
异常处理工作失败是相当令人费解的。我当然会感谢来自c++大师的想法/见解。顺便说一句,同样的问题也发生在Linux (RHEL5)上,但我目前正试图让异常处理在Windows上工作。
注意:当我让它调试后崩溃。我确实得到了一个"访问违规…无法读取位置"的消息。有了这些更新的信息,我希望c++中的一些东西仍然可以在Windows和amp上工作;
您是否尝试通过调用SetUnhandledExceptionFilter来捕获崩溃?
正如Miguel建议的那样,解决问题的正确方法可能是使用SetUnhandledExceptionFilter
。但我还是想详细解释一下你的现象。
首先,并非所有的程序"崩溃"都与异常有关。例如,CRT可以在错误时触发程序终止,例如在vector
中无效的元素访问,或者纯虚析构函数调用。如果您也想涵盖这些情况-参见set_unexpected
, set_terminate
等。
除此之外,catch
块只能捕获从适当的代码块抛出的异常。可能有函数在其他地方被调用,比如窗口过程(如果适用),其他线程等等。
catch(...)
这样的东西可能会捕获访问冲突等事情,以及为什么这种情况并不总是发生(就像你的情况一样)。
Windows提供了自己的异常处理机制——SEH,结构化异常处理。它远优于c++异常处理。此外,硬件中断(由CPU引起)会自动"转换"为SEH异常,因此使用SEH的代码可以同时处理软件异常和硬件故障。
微软c++编译器实际上通过SEH实现c++异常。也就是说,throw
是通过RaiseException
实现的,并指定了特定于c++的异常代码和参数,catch
是__except
的特定于c++的包装器,对于每个带有析构函数的对象,编译器会生成类似于__finally
块的东西。反之亦然。当引发非c++异常时-执行为c++异常生成的相同代码。
此外,还有所谓的编译器异常处理选项,这些选项既影响编译器异常处理代码的生成,也影响它在运行时的行为。它们被称为异常处理模型:
- 同步。编译器生成的代码保证只有在显式引发异常时才能正常工作。这包括
throw
语句,以及所有代码对编译器不可见的"外部"函数(在某些变体中-只有c++外部函数)。特别是从内存读取被认为是"安全的"。 - 异步。编译器不允许对可能出现异常的地方做任何假设。因此,即使访问内存地址产生异常,它也会生成应该正确工作的代码。
此外,在catch (...)
中调用的CRT代码会故意忽略非c++异常,除非选择异步EH模型。
因此,如果你想要catch (...)
捕获非c++异常-你必须选择异步EH模型。
当我在驱动程序开发中遇到相关问题后,我写了一篇关于代码项目的文章。
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- 执行视觉工作室异常处理模式
- 为什么隐式转换在异常处理中从派生到基?
- C++执行期间的类成员函数错误/异常处理
- C++ 中未处理的异常处理程序
- 用户定义的异常处理
- C :ScopeGuard vs返回支票和异常处理
- 异常处理期间的类型解析