You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:46:08