【问题标题】:Rethrowing multiple instances of exception_ptr containing same exception重新抛出包含相同异常的多个 exception_ptr 实例
【发布时间】:2015-04-26 12:47:01
【问题描述】:

以下sn-p的行为是否定义明确?

std::exception_ptr eptr;

try {
  ...
} catch (...) {
  eptr = std::current_exception();
}

std::exception_ptr eptr2(eptr);

std::vector<std::exception_ptr> eptrs{eptr, eptr2};

for (auto& exc: eptrs) try {
  std::rethrow_exception(exc);
} catch(std::exception& e) {
  std::cout << e.what() << '\n';
}

如果是这样,这是否要求异常对象本身(不仅仅是 exception_ptr)是可复制的?

【问题讨论】:

  • 但是当我们重新抛出 exception_ptr 的两个实例之一并抛出底层异常时,它是原始异常的副本吗?因为还有第二个 exception_ptr 实例包含原始异常。

标签: c++ exception c++11


【解决方案1】:

我不能引用标准,但查看 documentation 的 std::exception 指针它指出:

它是一种类似指针的共享类型:被指出的异常只要至少有一个 exception_ptr 指向它就保证保持有效,这可能会将其生命周期延长到 catch 语句的范围之外或跨线程。

exception_ptr 本身可以被复制:

被复制,包括被复制一个空指针值(或 nullptr)。

所以是的,行为已定义。 由于是类共享指针类型,所以包含的异常对象没有复制要求

这个article 进一步解释了它:

该功能的原始提案要求在使用 std::current_exception 捕获异常时复制异常,但在使用“Itanium ABI”(实际上也用于其他平台,例如 64 -bit x86 linux 和 MacOSX),减少了要求以允许引用计数异常。他们引用的问题是 ABI 没有存储异常对象的复制构造函数,因此当您调用 std::current_exception() 时,复制对象所需的信息不存在。

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2012-09-12
    • 2010-10-03
    • 1970-01-01
    • 2011-08-23
    • 2021-02-04
    相关资源
    最近更新 更多