为什么C ++不使用std :: nested_exception允许从析构函数中抛出?

anton_rh

从析构函数中引发异常的主要问题是,在调用析构函数的同时,另一个异常可能是“飞行中的”(std::uncaught_exception() == true),因此在这种情况下该怎么办并不明显。用新异常“覆盖”旧异常将是处理这种情况的一种可能方法。但已决定在这种情况下必须调用std::terminate(或另一个std::terminate_handler)。

C ++ 11通过std::nested_exception引入了嵌套异常功能此功能可用于解决上述问题。可以将旧的(未捕获的)异常嵌套到新的异常中(反之亦然?),然后可以抛出该嵌套的异常。但是这个想法没有被使用。std::terminate在C ++ 11和C ++ 14中仍会在这种情况下调用它。

这样的问题。是否考虑过嵌套异常的想法?有什么问题吗?C ++ 17中的情况不会改变吗?

尼科尔·波拉斯(Nicol Bolas)

当析构函数作为堆栈展开过程的一部分执行时(当您的对象不是作为堆栈展开的一部分创建时)1,并且析构函数需要发出异常时,就会发生您引用的问题

那怎么运作的呢?您有两个例外。X导致堆栈释放的异常例外异常Y是析构函数要抛出的异常nested_exception只能容纳其中一个

因此,也许您有一个例外,其中Y 包含一个nested_exception(或可能只是一个exception_ptr)。那么...您如何在catch现场处理呢?

如果您抓住了Y它,并且它恰好嵌入X某些东西,您将如何获得它?请记住:exception_ptr类型擦除除了传递它之外,您唯一可以做的就是将它扔掉。人们应该这样做:

catch(Y &e)
{
  if(e.has_nested())
  {
    try
    {
      e.rethrow_nested();
    }
    catch(X &e2)
    {
    }
  }
}

我没有看到很多人这样做。尤其是因为存在X-es的可能性非常大

1:请勿std::uncaught_exception() == true用于检测这种情况。这是非常有缺陷的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

为什么在C ++ 14中对lambda使用std :: bind?

来自分类Dev

为什么std :: shared_ptr从基类和派生类中调用析构函数,而delete仅从基类中调用析构函数?

来自分类Dev

为什么在std :: move之后需要析构函数调用?

来自分类Dev

什么是std :: ios :: exceptions在析构函数中的预期行为?

来自分类Dev

为什么C ++ std :: map :: operator []不使用inplace new?

来自分类Dev

为什么您不能从析构函数中抛出。例子

来自分类Dev

为什么C ++不使用父类构造函数?

来自分类Dev

为什么gcc在std :: uninitialized_copy中不使用memmove?

来自分类Dev

C ++清除类析构函数中的std :: list结构

来自分类Dev

为什么C ++标准为std :: bitset :: reference指定析构函数?

来自分类Dev

程序什么时候不使用c ++调用析构函数?

来自分类Dev

为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

来自分类Dev

为什么C ++不使用std :: nested_exception允许从析构函数中抛出?

来自分类Dev

当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

来自分类Dev

为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?

来自分类Dev

如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

来自分类Dev

为什么不使用double函数中声明的数字?(C)

来自分类Dev

为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

来自分类Dev

为什么从`std :: async`阻塞返回的是将来的析构函数?

来自分类Dev

为什么您不能从析构函数中抛出。例子

来自分类Dev

为什么OpenGL函数不使用模板?

来自分类Dev

为什么“ fopen”函数不使用枚举?

来自分类Dev

为什么要使用虚拟析构函数?

来自分类Dev

为什么不使用StreamProvider中的getUriFromFile?

来自分类Dev

为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?

来自分类Dev

为什么不能使用析构函数进行类化

来自分类Dev

为什么不使用回调函数?

来自分类Dev

为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

来自分类Dev

用函数对数组进行排序而不使用 C 中的指针是行不通的。为什么?

Related 相关文章

  1. 1

    为什么在C ++ 14中对lambda使用std :: bind?

  2. 2

    为什么std :: shared_ptr从基类和派生类中调用析构函数,而delete仅从基类中调用析构函数?

  3. 3

    为什么在std :: move之后需要析构函数调用?

  4. 4

    什么是std :: ios :: exceptions在析构函数中的预期行为?

  5. 5

    为什么C ++ std :: map :: operator []不使用inplace new?

  6. 6

    为什么您不能从析构函数中抛出。例子

  7. 7

    为什么C ++不使用父类构造函数?

  8. 8

    为什么gcc在std :: uninitialized_copy中不使用memmove?

  9. 9

    C ++清除类析构函数中的std :: list结构

  10. 10

    为什么C ++标准为std :: bitset :: reference指定析构函数?

  11. 11

    程序什么时候不使用c ++调用析构函数?

  12. 12

    为什么std :: vector :: emplace调用析构函数而不调用任何拷贝构造函数?

  13. 13

    为什么C ++不使用std :: nested_exception允许从析构函数中抛出?

  14. 14

    当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

  15. 15

    为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?

  16. 16

    如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

  17. 17

    为什么不使用double函数中声明的数字?(C)

  18. 18

    为什么要在std :: vector :: push_back(T object)方法中构造对象时调用析构函数?

  19. 19

    为什么从`std :: async`阻塞返回的是将来的析构函数?

  20. 20

    为什么您不能从析构函数中抛出。例子

  21. 21

    为什么OpenGL函数不使用模板?

  22. 22

    为什么“ fopen”函数不使用枚举?

  23. 23

    为什么要使用虚拟析构函数?

  24. 24

    为什么不使用StreamProvider中的getUriFromFile?

  25. 25

    为什么在VC中,“ delete”和“ delete []”都使用标量删除析构函数?

  26. 26

    为什么不能使用析构函数进行类化

  27. 27

    为什么不使用回调函数?

  28. 28

    为什么使用虚拟析构函数进行std :: vector :: push_back segfaults?

  29. 29

    用函数对数组进行排序而不使用 C 中的指针是行不通的。为什么?

热门标签

归档