从无效参数处理程序

时间:2016-02-05 06:34:37

标签: c++ exception

我使用VS2015并且我想从无效参数处理程序中抛出errno,以便我可以在catch块中格式化错误消息。我的代码如下所示:

_set_invalid_parameter_handler([](wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t) {
    throw errno;
});
try
{
    char buffer[2];
    strcpy_s(buffer, "testtest");
}
catch (int e)
{
    //strerror
    perror("catch int");
}
catch (...)
{
    perror("catch ...");
}

如果我在debug模式下编译,代码在release模式下运行正常。为什么表现不同?

1 个答案:

答案 0 :(得分:1)

您必须更改编译选项,优化程序会在Release版本中过于激进地删除异常过滤器,以便您的程序立即通过terminate()进行轰炸。

确保您选择了Release配置,Project>属性> C / C ++>代码生成>启用C ++异常设置。将其从默认值/ Ehsc更改为/ Ehs。

这里的“c”限定符,它允许优化器假设extern "C"函数永远不会抛出C ++异常。 strcpy_s()是一个C函数。使用/ Eha也可以修复它,这会强制优化器完全不采取任何措施。但是让catch (...)太危险了,它现在也会捕捉到像AV这样令人讨厌的SEH。