如何捕获C++标准17.6.4.10[res.on.exception.handing]中描述的异常

How do I catch an exception as described in the C++ standard, 17.6.4.10 [res.on.exception.handling]?

本文关键字:handing exception on 异常 描述 res 标准 C++ 何捕获      更新时间:2023-10-16

短版本:什么是"C++标准17.6.4.10[res.on.exception.handing]中描述的异常"?我该如何捕获异常?

长版本

我想捕获不将system::error_code作为参数的boost::create_directories()版本引发的异常。Boost文件系统错误报告文档称create_directories()通过…报告错误

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

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

第一个案例是显而易见的,我已经处理了这种情况。但我找不到任何关于如何处理第二个案件的解释。在谷歌上搜索"C++标准17.6.4.10 res.on.exception.handling中描述的异常"会产生三篇文章(可能是非零搜索结果的记录),但它们都没有告诉我如何处理这样的异常。

有人能帮忙吗?

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

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

我认为您想要的是捕获std::exception,因为就"当分配存储失败时抛出异常[…]"而言,最有可能的情况是从std::exception派生的std::bad_alloc

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

17.6.5.12异常处理的限制

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

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

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

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