我对throw()说明符的理解是,当从给定函数中抛出时,说明符中未列出的任何异常类型都将导致对std :: unexpected()的调用。
所以我希望以下代码的输出是“意外调用”,但我看到“捕获异常”。我正在使用VS2013编译它,它没有实现noexcept
这就是我使用throw()
的原因。
#include <iostream>
#include <exception>
void testFunc() throw () {
throw std::exception();
}
int main(void) {
std::set_unexpected([](){
std::cout << "unexpected called";
});
try {
testFunc();
}
catch (...) {
std::cerr << "Caught an exception";
}
return 0;
}
为什么没有调用std :: unexpected?
答案 0 :(得分:1)
https://msdn.microsoft.com/en-us/library/vstudio/wfa0edys%28v=vs.120%29.aspx说:
Visual C ++在其实现中脱离了ISO C ++标准 例外规范。
[...]
[...]如果从标记为
throw()
的函数中抛出异常,则 Visual C ++编译器不会调用unexpected
[...]。[...]
由于代码 可能由C ++编译器执行的优化(基于 假设函数不抛出任何C ++异常)if 函数会抛出异常,程序可能无法执行 正确。
此外,为了支持上述内容,https://msdn.microsoft.com/en-us/library/vstudio/awbt5tew.aspx说:
C ++标准要求在函数时调用
unexpected
抛出一个不在其throw列表中的异常。目前 实施不支持这个。