简短版本:什么是“C ++标准中描述的异常,17.6.4.10 [res.on.exception.handling]”,如何捕获?
长版......
我想抓住boost::create_directories()
版本中不以system::error_code
为参数的异常。 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”产生三篇文章(可能是非零搜索结果的记录),并且它们都没有告诉我如何处理这样的异常。
有人可以帮忙吗?
答案 0 :(得分:3)
我认为他们的意思是他们会(间接)抛出std::bad_alloc
。你可能实际上并不想尝试捕获它,因为在任何情况下,内存不足的程序可能无法继续。尽管如此 - 我前几天阅读了相同的文档,这就是我的结论。
答案 1 :(得分:1)
关于异常处理的当前C ++ 11标准的实际段落是§17.6.5.12。 但是没有关于嘘声库可能抛出的有用信息,除非有抛出指定段落。
我认为你想要的是抓住std::exception
,因为在“分配存储失败时抛出异常[...]”最可能的情况是std::bad_alloc
它来自std::exception
。
答案 2 :(得分:0)
在阅读boost::filesystem
文档时遇到同样的问题。在n4296中宣布了C ++ 14标准草案:
17.6.5.12异常处理的限制
C ++标准库中定义的任何函数都可以通过抛出其Throws:段落中描述的类型的异常来报告失败。实现可以通过添加非抛出noexcept规范来加强非虚函数的异常规范。
- 醇>
如果函数的类型派生自Throws子句中指定的类型,并且将被基类型的异常处理程序捕获,则函数可能抛出未在其Throws子句中列出的类型的对象。
这听起来不太有用,因此需要在增强源中找到真正的答案,这些源目前托管在Github上。实际上,根据定义的每个实现,如果未提供boost::filesystem::filesystem_error
参数,则将抛出ec
异常。
if (ec == 0)
BOOST_FILESYSTEM_THROW(filesystem_error(
"boost::filesystem::create_directories", parent, local_ec));