类型
<exception>

std::exception_ptr

异常指针
可以指向异常对象的智能指针类型。

它是一种*类似共享指针*的类型:只要至少有一个 exception_ptr 指向它,所指向的异常就可以保证保持有效,这可能将其生命周期延长到超出 `catch` 语句的作用域或跨越线程。

不同的库可能以不同的方式实现此类型,但它至少应支持以下操作而不抛出异常:
  • 默认构造(获得一个*空指针*值)。
  • 复制,包括复制一个*空指针*值(或 nullptr)。
  • 使用 operator==operator!= 与另一个 exception_ptr 对象(或 nullptr)进行比较,其中两个*空指针*始终被视为等价,而两个非*空指针*仅在指向同一个异常对象时才被视为等价。
  • 可以进行上下文转换到 bool,如果值为*空指针*则转换为 false,否则转换为 true
  • 可以进行交换,并且可以进行析构。

该类型也不得隐式转换为算术、枚举或指针类型。

对该对象执行任何其他操作(例如解引用),如果库实现支持,将导致*未定义行为*。

此类型的对象通过调用:current_exceptionmake_exception_ptrnested_exception::nested_ptr 来获取,并且可以通过调用 rethrow_exception 来重新抛出指向的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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 对象可移植支持的任何操作(如上所述)都不会访问或修改指向的异常对象。

该类不对异常对象提供额外的同步保证。

异常安全

无抛出保证:任何必需的操作都不会抛出异常。

请注意,对对象执行任何未明确支持的操作(如上所述)将导致*未定义行为*。

另见