【发布时间】:2019-11-20 13:11:30
【问题描述】:
从this answer 和this 之类的页面,我了解到异常可能在被抛出的过程中被复制。我还了解到,这个复制不能抛出任何额外的异常,否则会调用std::terminate()。这使得编写异常类变得困难,因为例如std::string 在复制时可能会引发异常。
我的问题:为什么 C++ 允许编译器复制异常?通过引用或指针抛出它们并要求程序员通过引用或指针而不是值来捕获它们会有什么缺点?
似乎一个解决方案可能是将任何重要的成员包装在std::shared_ptr 之类的东西中,并复制该指针而不是它持有的对象。但随后我们失去了复制的所有潜在优势(例如,您可以在原件保持不变的情况下编辑副本)。那么为什么 C++ 坚持要能够复制异常呢?
【问题讨论】:
-
您链接的答案没有提及复制异常。它谈到了在构造异常时复制
std::string -
一般来说,你不能禁止别人复制你抛出的异常。你的问题基本上是问为什么标准是这样的,恕我直言太宽泛/基于意见
-
顺便说一句,内存不足是您很少能从中恢复的。如果你不是在做一些超级关键的事情,我不会太担心创建一个抛出第二个异常的异常
-
你知道
std::current_exception吗?如果没有,检查它的作用,并思考必须发生的事情,应该可以回答您的问题。 -
@BiagioFesta - 在这里,通过复制或引用来捕捉不是重要的。即使你捕获了一个引用,
current_exception也需要复制当前的异常对象,以便构造它的exception_ptr,因为异常对象通常是在自动范围内构造的。始终在动态范围内构造异常对象消除了可复制异常的需要,但增加了 99% 的时间不需要的大量开销。因此,在自动范围内构造,并仅在绝对需要时复制异常对象。
标签: c++ exception copy-constructor