标记为noexcept的函数内部是否有例外?

时间:2015-03-10 22:07:20

标签: c++ exception c++11 noexcept

假设我有一个标记为noexcept的函数,但里面有一行代码可以抛出。那行代码将在try块中,异常将被捕获。这会导致什么吗?

void MyFunc() noexcept
{
    try {
        throw std::exception("...");
    } catch (const std::exception & e) {
        // I'll deal with it here...
    }
}

2 个答案:

答案 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]