如何捕获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]?
短版本:什么是"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异常处理的限制
C++标准库中定义的任何函数都可以通过抛出其Throws:paragraph中描述的类型的异常来报告失败。实现可以通过添加非抛出noexcept规范来加强非虚拟函数的异常规范。
如果函数的类型是从Throws子句中命名的类型派生的,并且会被基类型的异常处理程序捕获,则函数可能会抛出其Throws语句中未列出的类型的对象。
这听起来信息量不大,因此真正的答案需要在目前托管在Github上的boost源中找到。事实上,如果没有提供ec
参数,那么每个在那里定义的实现都会抛出boost::filesystem::filesystem_error
异常。
if (ec == 0)
BOOST_FILESYSTEM_THROW(filesystem_error(
"boost::filesystem::create_directories", parent, local_ec));
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 链表"exception thrown"
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- C++ broken_promise exception
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- QVTKWidget SetRenderWindow() with PCLVisualizer Exception
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 使用flag、return、exception、goto或break中止过程
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 派生自 std::exception 的类的赋值运算符
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- std::exception :使用虚函数和继承与变量
- MFC ODBC SQLConfigDataSource() Unhandled Exception
- 这段 C++ 代码的奇怪行为(std::wcout 和 std::exception)
- VTK 7.1.1: vtkX3DExporter exception
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- opencv cv::addText exception if no window
- Ctypes: OSError: exception: stack overflow
- 如何捕获C++标准17.6.4.10[res.on.exception.handing]中描述的异常