C++03中如何在catch(...)捕获块中获取未知异常信息?
在C++03(Visual Studio 2003)的catch(...)块中获取异常信息的方法
C++03标准本身并未提供在catch(...)中获取异常具体信息的官方途径,但Visual Studio 2003作为微软的编译器,提供了几个非标准扩展可以实现这个需求,分两种场景处理:
一、处理C++类型的异常
如果抛出的是C++异常(非SEH异常),可以使用VS专属的_GetExceptionObject()函数获取异常对象的指针,之后可以尝试类型转换或利用RTTI(运行时类型信息)识别异常类型:
#include <typeinfo> #include <iostream> try { LibraryCall(); } catch (std::exception& ex) { // 处理标准异常 } catch (int) { // 处理int类型异常 } catch (...) { void* exObj = _GetExceptionObject(); if (exObj) { // 尝试转换为std::exception if (std::exception* stdEx = static_cast<std::exception*>(exObj)) { std::cout << "Std exception caught: " << stdEx->what() << std::endl; } // 利用RTTI输出异常类型名称 else { std::cout << "Unknown exception type: " << typeid(*static_cast<void**>(exObj)).name() << std::endl; } } }
注意:_GetExceptionObject()是VS非标准扩展,仅在Visual Studio编译器中可用,且需要启用RTTI(默认可能开启,若未开启需在项目设置中启用)。
二、处理SEH结构化异常
如果库抛出的是SEH异常(比如硬件访问错误、非法指令等,VS默认的/EHa编译选项会让catch(...)捕获这类异常),可以使用Windows API的GetExceptionCode()和GetExceptionInformation()获取异常详情:
#include <windows.h> #include <eh.h> try { LibraryCall(); } catch (std::exception& ex) { // 处理标准异常 } catch (int) { // 处理int类型异常 } catch (...) { DWORD exCode = GetExceptionCode(); switch (exCode) { case EXCEPTION_ACCESS_VIOLATION: // 处理内存访问违规 break; case EXCEPTION_INT_DIVIDE_BY_ZERO: // 处理整数除零错误 break; case EXCEPTION_ILLEGAL_INSTRUCTION: // 处理非法指令错误 break; // 其他SEH异常代码可参考Windows API文档 } // 获取异常上下文指针(仅在catch(...)直接调用有效,不可传递到其他函数) EXCEPTION_POINTERS* exPtrs = GetExceptionInformation(); if (exPtrs) { // 可读取exPtrs->ContextRecord或exPtrs->ExceptionRecord获取更详细信息 } }
注意:GetExceptionInformation()必须直接在catch(...)块中调用,不能在子函数中使用,因为栈展开后异常信息会失效。
内容的提问来源于stack exchange,提问作者AlainD
相关产品推荐
相关产品推荐

