名前空間
変種
操作

std::uncaught_exception, std::uncaught_exceptions

提供: cppreference.com
< cpp‎ | error
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
エラー処理
例外処理
uncaught_exceptionuncaught_exceptions
(C++20未満)(C++17)
例外処理の失敗
(C++17未満)
(C++17未満)
(C++11)(C++17未満)
(C++17未満)
エラー番号
エラー番号
 
ヘッダ <exception> で定義
(1)
bool uncaught_exception() throw();
(C++11未満)
bool uncaught_exception() noexcept;
(C++11以上)
(C++17で非推奨)
(C++20で削除)
int uncaught_exceptions() noexcept;
(2) (C++17以上)
1) 現在のスレッドが活動中の例外オブジェクトを持つ、つまり、例外オブジェクトが投げられ、または投げ直され、マッチする catch 節や std::terminatestd::unexpected にまだ入っていないかどうかを検出します。 別の言い方をすると、 std::uncaught_exceptionスタックの巻き戻しが現在進行中かどうかを検出します。
2) 現在のスレッドで投げられ、または投げ直され、マッチする catch 節に入っていない例外がいくつあるかを検出します。

std::uncaught_exception() == true であっても例外を投げて安全なことが時々あります。 例えば、 スタックの巻き戻しがオブジェクトの破棄を発生させた場合、そのオブジェクトのデストラクタは、デストラクタから抜ける前に何らかの catch ブロックによってキャッチされる限りにおいては、例外を投げるコードを実行することができます。

目次

[編集] 引数

(なし)

[編集] 戻り値

1) このスレッドでスタックの巻き戻しが現在進行中であれば true
2) 現在のスレッドでキャッチされていない例外オブジェクトの数。

[編集] ノート

int を返す uncaught_exceptions が使われる例は boost.log ライブラリです。 式 BOOST_LOG(logger) << foo(); はまずガードオブジェクトを作成し、そのコンストラクタでキャッチされていない例外の数を記録します。 出力は、 foo() は例外を投げなければ (デストラクタにおけるキャッチされていない例外の数がコンストラクタで観測された値より大きければ)、ガードオブジェクトのデストラクタによって行われます。

[編集]

#include <iostream>
#include <exception>
#include <stdexcept>
 
struct Foo {
    int count = std::uncaught_exceptions();
    ~Foo() {
        std::cout << (count == std::uncaught_exceptions()
            ? "~Foo() called normally\n"
            : "~Foo() called during stack unwinding\n");
    }
};
int main()
{
    Foo f;
    try {
        Foo f;
        std::cout << "Exception thrown\n";
        throw std::runtime_error("test exception");
    } catch (const std::exception& e) {
        std::cout << "Exception caught: " << e.what() << '\n';
    }
}

出力:

Exception thrown
~Foo() called during stack unwinding
Exception caught: test exception
~Foo() called normally

[編集] 関連項目

例外処理が失敗したときに呼ばれる関数
(関数) [edit]
例外オブジェクトを扱うための共有ポインタ型
(typedef) [edit]
現在の例外を std::exception_ptr にキャプチャします
(関数) [edit]

[編集] 外部リンク