假设我有一个标记为noexcept
的函数,但里面有一行代码可以抛出。那行代码将在try块中,异常将被捕获。这会导致什么吗?
void MyFunc() noexcept
{
try {
throw std::exception("...");
} catch (const std::exception & e) {
// I'll deal with it here...
}
}
答案 0 :(得分:6)
从内到外搜索异常处理程序,只要找不到任何处理异常的内容,就会搜索一个更低级别的内容。
15.3处理异常[except.handle]
4尝试块的处理程序按外观顺序进行尝试。 [...]
[...]
6如果在try块的处理程序中找不到匹配项,则搜索匹配的处理程序将继续在同一线程的动态周围的try块中继续。
15.4异常规范[except.spec]
9每当抛出异常并且搜索处理程序(15.3)遇到具有异常 - 规范且不允许异常的函数的最外层块时,则
[...
std::unexpected()
或std::terminate()
被调用。 ]
唯一一次noexcept(true)
具有可见效果的是,如果从函数内部抛出异常,并且不存在匹配的处理程序。没有为具有匹配处理程序的异常指定特殊效果,因此必须与noexcept(false)
函数中的相同。
答案 1 :(得分:4)
是的,这是完全合法的,只要例外不会泄露出来。
实现不应仅仅因为执行时抛出或抛出表达式而拒绝表达式 包含函数不允许的异常。
[C ++ 11中的except.spec / 11]