正在重试包含同一异常的exception_ptr的多个实例

Rethrowing multiple instances of exception_ptr containing same exception

本文关键字:ptr 实例 exception 重试 包含同 异常      更新时间:2023-10-16

以下代码段的行为是否定义良好?

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)是可复制的?

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

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

exception_ptr本身可能被复制:

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

是的,行为已经定义。由于它是一个类似的共享指针类型,因此不需要对包含的异常对象进行复制

这篇文章进一步解释了它:

该功能的原始提案要求在使用std::current_exception捕获异常时复制该异常,但在使用"安腾ABI"(实际上也用于其他平台,如64位x86 linux和MacOSX)的实现者的压力下,该要求被降低,以允许对异常进行引用计数。他们提到的问题是ABI没有存储异常对象的复制构造函数,所以当您调用std::current_exception()时,复制对象所需的信息不存在。