【问题标题】:How do I catch an exception as described in the C++ standard, 17.6.4.10 [res.on.exception.handling]?如何捕获 C++ 标准 17.6.4.10 [res.on.exception.handling] 中描述的异常?
【发布时间】:2013-06-22 05:20:35
【问题描述】:

短版:什么是“C++ 标准中描述的异常,17.6.4.10 [res.on.exception.handling]”,我该如何捕捉?

加长版...

我想捕捉不以system::error_code 作为参数的boost::create_directories() 版本引发的异常。 Boost Filesystem Error Reporting Documentation 表示 create_directories() 通过...报告错误

a> 当实现对操作系统或其他底层 API 的调用导致错误导致函数无法满足其规范时,抛出 boost::filesystem_error,或者...

b> 在分配存储失败时抛出 C++ 标准 17.6.4.10 [res.on.exception.handling] 中所述的异常。

第一种情况很明显,我已经处理了这种情况。但我找不到如何处理第二种情况的任何解释。谷歌搜索“C++ 标准中描述的异常,17.6.4.10 res.on.exception.handling”会产生三篇文章(这可能是非零搜索结果的记录),但没有一篇告诉我如何处理这样的例外。

谁能帮忙?

【问题讨论】:

    标签: c++ exception boost


    【解决方案1】:

    我认为他们的意思是他们将(间接)抛出std::bad_alloc。但是,您实际上可能不想尝试捕捉它,因为内存不足的程序可能在任何情况下都无法继续。不过,这取决于你——前几天我读了同样的文档,这就是我得出的结论。

    【讨论】:

    • 所以“分配存储失败”是指内存?我认为这意味着磁盘空间(作为文件系统调用)。
    • 我认为它们是指记忆,是的。任何与文件相关的故障都应导致其自定义异常类(的后代)被抛出,如第一种情况中所述。令人困惑的措辞,真的。
    【解决方案2】:

    当前 C++11 标准中有关异常处理的实际段落是 §17.6.5.12。 但是没有关于 boos 库可能抛出什么的有用信息,除非有抛出指定段落。

    我认为您想要的是捕获 std::exception,因为“在分配存储失败时抛出异常 [...]”的最可能情况是 std::bad_alloc,它源自 @ 987654323@.

    【讨论】:

      【解决方案3】:

      在阅读boost::filesystem 文档时遇到了同样的问题。在 C++14 标准的 n4296 草案中声明如下:

      17.6.5.12 异常处理的限制

      1. C++ 标准库中定义的任何函数都可以通过抛出其 Throws: 段落中描述的类型的异常来报告失败。实现可以通过添加不抛出的 noexcept 规范来加强非虚拟函数的异常规范。

      2. 如果函数的类型派生自 Throws 子句中指定的类型并且会被基类型的异常处理程序捕获,则该函数可能会抛出其 Throws 子句中未列出的类型的对象。

      这听起来没有什么信息,因此需要在 boost 源中找到真正的答案,这些源目前托管在 Github 上。实际上,如果没有提供ec 参数,则每个在那里定义的实现都会抛出boost::filesystem::filesystem_error 异常。

      if (ec == 0)
        BOOST_FILESYSTEM_THROW(filesystem_error(
          "boost::filesystem::create_directories", parent, local_ec));
      

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 2019-04-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多