std::
<exception_ptr>
类型 <exception>
异常指针
可以引用异常对象的智能指针类型。
它是一个共享的类指针类型:只要至少有一个exception_ptr指向它,被指向的异常就保证保持有效,
从而可能将其生存期扩展到catch语句的作用域之外或跨线程。
不同的库可能会以不同的方式实现此类型,但它至少应该支持以下操作而不引发:
-
默认构造(获取空指针值)。
-
被复制,包括被复制一个空指针值(或nullptr)。
-
使用operator==或operator!与另一个exception_ptr对象(或nullptr)进行比较=,
其中两个空指针始终被认为是等价的,而两个非空指针只有在引用相同异常对象时才被认为是等价的。
-
上下文可转换为bool值,如果有空指针值,则为false,否则为true。
-
被交换,被销毁。
还要求该类型不能隐式转换为算术、枚举或指针类型。
如果库实现支持对对象执行任何其他操作(如解除对其引用),则会导致未定义的行为。
该类型的对象可以通过调用:current_exception、make_exception_ptr或nested_exception::nested_ptr获得,
可以通过调用rethrow_exception重新抛出指向的异常来访问。
☣ 示例
// exception_ptr example
#include <iostream> // std::cout
#include <exception> // std::exception_ptr, std::current_exception, std::rethrow_exception
#include <stdexcept> // std::logic_error
int main () {
std::exception_ptr p;
try {
throw std::logic_error("some logic_error exception"); // throws
} catch(const std::exception& e) {
p = std::current_exception();
std::cout << "exception caught, but continuing...\n";
}
std::cout << "(after exception)\n";
try {
std::rethrow_exception (p);
} catch (const std::exception& e) {
std::cout << "exception caught: " << e.what() << '\n';
}
return 0;
}
|
输出:
exception caught, but continuing...
(after exception)
exception caught: some logic_error exception
⇄ 数据竞争
exception_ptr对象(如上所述)可移植支持的任何操作都不能访问或修改指向的异常对象。
该类不向异常对象提供额外的同步保证。
☂ 异常安全性
无抛出保证:没有成员抛出异常。
注意,对对象执行任何不受显式支持的操作(如上所述)都会导致未定义的行为。
🍄 另请参阅