型別
<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 物件可移植支援的任何操作(如上所述)都不會訪問或修改指向的異常物件。

該類不對異常物件提供額外的同步保證。

異常安全

無丟擲保證:任何必需的操作都不會丟擲異常。

請注意,對物件執行任何未明確支援的操作(如上所述)將導致*未定義行為*。

另見