处理特定类型的SEH异常(仅访问冲突)

时间:2019-03-20 16:09:23

标签: c++ windows exception seh

为了处理访问冲突异常,应为项目配置SEH异常(/ EHa)。

我正在寻找仅处理访问冲突异常的方法。根据此Microsoft出版物here,为了捕获此SEH异常,必须使用将捕获所有异常的常规捕获catch(...)

问题是,是否有一个选项可以特定地处理此异常并保留其他未处理的SEH,而不必使用try / catch模式。

更新:由于下面评论中的链接,我发现了用于处理SEH异常的__try/__except结构以及许多内在函数,这些固有函数可能会提供有关异常性质的更多详细信息。

在某些情况下,我只关心AV异常,因此我希望避免这种情况。但是,我使用的是C ++,并且更喜欢使用标准的try/catch结构(在配置/ EHa编译器选项时)。

是否可以使用这些内在函数来检查我的情况下的异常类型?

1 个答案:

答案 0 :(得分:0)

使用_set_se_translator仅可以在SEH异常中定义所需的行为,而将所有非seh异常保留在catch语句中。

我定义了以下处理方式(应为每个线程设置):

void mySEHtranslator(unsigned int exceptionCode, PEXCEPTION_POINTERS exceptionRecord)
{
    if (exceptionRecord->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
    {
        puts("access violation not count");
    }
    else
    {
        throw "1"; // does not suppose to be caught. 
    }
}

,在相关代码部分中,我想暗示翻译器忽略访问冲突:

void mycode()
{
    _set_seh_translator(mySEHtranslator);

    try {
        .... my code ...
    } 
    catch (...) // does not suppose to catch the "1" 
    {

    }
}

可以找到其他参考here