3

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

长版...

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

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

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

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

任何人都可以帮忙吗?

4

3 回答 3

3

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

于 2013-06-25T12:09:27.617 回答
1

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

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

于 2013-06-25T12:13:29.360 回答
0

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

17.6.5.12 异常处理的限制

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

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

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

if (ec == 0)
  BOOST_FILESYSTEM_THROW(filesystem_error(
    "boost::filesystem::create_directories", parent, local_ec));
于 2016-06-29T21:44:52.997 回答