【问题标题】:Can a function marked as noexcept have exceptions inside?标记为 noexcept 的函数内部可以有异常吗?
【发布时间】:2015-05-12 13:21:43
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    搜索异常处理程序是从内到外完成的,只要找不到任何处理异常的东西,搜索深度就会减少一级。

    15.3 处理异常 [except.handle]

    4 try 块的处理程序按出现的顺序进行尝试。 [...]

    [...]

    6 如果在 try 块的处理程序中未找到匹配项,则在同一线程的动态周围的 try 块中继续搜索匹配的处理程序。

    15.4 异常规范 [except.spec]

    9 每当抛出异常并且对处理程序 (15.3) 的搜索遇到一个函数的最外层块,该函数的 exception-specification 不允许该异常,那么,

    [... std::unexpected()std::terminate() 被调用。 ]

    noexcept(true) 唯一可见的效果是如果从函数内部抛出异常,并且不存在匹配的处理程序。没有为具有匹配处理程序的异常指定特殊效果,因此它必须像在 noexcept(false) 函数中一样运行。

    【讨论】:

      【解决方案2】:

      是的,这是完全合法的,只要异常不会泄漏到函数之外。

      实现不应仅仅因为表达式在执行时抛出或可能抛出而拒绝 包含函数不允许的异常。

      [C++11 中除了.spec/11]

      【讨论】:

      • 您的答案是正确的,但您的报价适用于void MyFunc() noexcept { throw std::exception("..."); }(没有try/catch),并且仅声明编译器不得拒绝它,它没有涵盖如何异常在运行时处理。
      猜你喜欢
      • 2016-07-23
      • 2021-01-04
      • 2015-01-07
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 2021-09-14
      • 2020-03-10
      • 2022-01-02
      相关资源
      最近更新 更多