最終更新日時: 2026年05月18日 17時46分06秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<exception>

# std::current_exception(C++11)

    namespace std {
      exception_ptr current_exception() noexcept; // (1) C++11
    }

## 概要

現在処理中の例外オブジェクトを指す`exception_ptr`を取得する。

## 戻り値

- 現在処理中の例外オブジェクトを指す`exception_ptr`を返す
- 処理中の例外オブジェクトがない場合は、ヌルを指す`exception_ptr`を返す
- この関数がメモリ確保する必要があり、それに失敗した場合、`bad_alloc`オブジェクトを指す`exception_ptr`を返す
- この関数を2回以上呼び出した場合に、同じオブジェクトを指す`exception_ptr`が返るとは限らない。(呼び出しのたびに例外オブジェクトを作る可能性がある)
- 例外オブジェクトをコピーする際に例外が送出された場合、送出された例外オブジェクトを指す`exception_ptr`を返す
  - ただし、無限再帰を回避するために、`bad_exception`オブジェクトを指す`exception_ptr`を返すことが実装に許可される

## 例外

投げない

## 備考

この関数は、`catch`節で使用すれば、処理中の例外オブジェクトへの例外ポインタを取得できる。

ただし、例外送出によるスタック巻き戻し中は、取得できないので注意。(スタック巻き戻し中とは、`try`ブロック中で定義されたオブジェクトのデストラクタのこと)

## 例

    #include <iostream>
    #include <exception>
    #include <stdexcept>

    int main()
    {
      std::exception_ptr ep;

      try {
        throw std::runtime_error("error!");
      }
      catch (...) {
        std::cout << "catch" << std::endl;
        ep = std::current_exception(); // 処理中の例外ポインタを取得
      }

      if (ep) {
        std::cout << "rethrow" << std::endl;
        std::rethrow_exception(ep); // 再送出
      }
    }

### 出力例

    catch
    rethrow

    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    terminate called after throwing an instance of 'std::runtime_error'
      what():  error!

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: 2010 ✅, 2012 ✅, 2013 ✅, 2015 ✅

## 関連項目

- C++26 定数評価での例外送出を許可
- `std::exception_ptr_cast()`

## 参照

- N2179 Language Support for Transporting Exceptions between Threads
- Can I use `std::current_exception` during stack unwinding? - StackOverflow
- P3842R2 A conservative fix for constexpr `uncaught_exceptions()` and `current_exception()`
  - C++26の策定中に`constexpr`が追加されたが、本提案文書により巻き戻された (C++29で再検討予定)