处理应用程序中的访问冲突

时间:2013-12-26 23:37:49

标签: c++ exception-handling

我的x64应用程序是使用/ EHa编译的,

我希望保护我的代码免受访问冲突,但无论我的SEH和终止处理程序如何,应用程序进程似乎都会崩溃。

void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
    cout << "se_translator_called" << endl;
}

void my_terminate_handler() {
    cout << "my_terminate_handler_called" << endl;
}

#pragma optimize("", off)
void test() {

    int* k = nullptr;
    int z = *k;
}
#pragma optimize("", on)

int main(int argc, char* argv[]) {

    _set_se_translator(my_se_translator);
    set_terminate(my_terminate_handler);

    test();

    return 0;
}

对于为什么_set_se_translator在这种情况下无法正常工作,会有一个很好的解释吗?

1 个答案:

答案 0 :(得分:1)

来自MSDN website

  

你的翻译函数不应该只是输入一个C ++类型   例外。如果它除了投掷之外还做任何事情(例如   例如,写入日志文件)您的程序可能不会表现为   预期,因为翻译功能的次数   调用是依赖于平台的。

添加简单的异常类时:

class myException{
};

然后在my_se_translator函数中抛出异常,并在main示例或test函数中捕获异常,例如:

void my_se_translator(unsigned int, struct _EXCEPTION_POINTERS*) {
    std::cout << "se_translator_called" << std::endl;
    throw myException();
}

int main(int argc, char* argv[]) {


    _set_se_translator(my_se_translator);
    set_terminate(my_terminate_handler);
    try{
        test();
    }
    catch(myException e) {
        std::cout << "EXCEPTION!" << std::endl;
    }
    return 0;
}