我使用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
模式下运行正常。为什么表现不同?
答案 0 :(得分:1)
您必须更改编译选项,优化程序会在Release版本中过于激进地删除异常过滤器,以便您的程序立即通过terminate()进行轰炸。
确保您选择了Release配置,Project>属性> C / C ++>代码生成>启用C ++异常设置。将其从默认值/ Ehsc更改为/ Ehs。
这里的“c”限定符,它允许优化器假设extern "C"
函数永远不会抛出C ++异常。 strcpy_s()是一个C函数。使用/ Eha也可以修复它,这会强制优化器完全不采取任何措施。但是让catch (...)
太危险了,它现在也会捕捉到像AV这样令人讨厌的SEH。