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

时间:2013-06-25 12:04:56

标签: c++ exception boost

简短版本:什么是“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”产生三篇文章(可能是非零搜索结果的记录),并且它们都没有告诉我如何处理这样的异常。

有人可以帮忙吗?

3 个答案:

答案 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异常处理的限制

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

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

  4.   

这听起来不太有用,因此需要在增强源中找到真正的答案,这些源目前托管在Github上。实际上,根据定义的每个实现,如果未提供boost::filesystem::filesystem_error参数,则将抛出ec异常。

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