std::uncaught_exception, std::uncaught_exceptions
提供: cppreference.com
ヘッダ <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::terminate、 std::unexpected にまだ入っていないかどうかを検出します。 別の言い方をすると、
std::uncaught_exception
はスタックの巻き戻しが現在進行中かどうかを検出します。2) 現在のスレッドで投げられ、または投げ直され、マッチする catch 節に入っていない例外がいくつあるかを検出します。
std::uncaught_exception() == true であっても例外を投げて安全なことが時々あります。 例えば、 スタックの巻き戻しがオブジェクトの破棄を発生させた場合、そのオブジェクトのデストラクタは、デストラクタから抜ける前に何らかの catch ブロックによってキャッチされる限りにおいては、例外を投げるコードを実行することができます。
目次 |
[編集] 引数
(なし)
[編集] 戻り値
1) このスレッドでスタックの巻き戻しが現在進行中であれば true。
2) 現在のスレッドでキャッチされていない例外オブジェクトの数。
[編集] ノート
int を返す uncaught_exceptions
が使われる例は boost.log ライブラリです。 式 BOOST_LOG(logger) << foo(); はまずガードオブジェクトを作成し、そのコンストラクタでキャッチされていない例外の数を記録します。 出力は、 foo() は例外を投げなければ (デストラクタにおけるキャッチされていない例外の数がコンストラクタで観測された値より大きければ)、ガードオブジェクトのデストラクタによって行われます。
[編集] 例
Run this code
#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
[編集] 関連項目
例外処理が失敗したときに呼ばれる関数 (関数) | |
(C++11) |
例外オブジェクトを扱うための共有ポインタ型 (typedef) |
(C++11) |
現在の例外を std::exception_ptr にキャプチャします (関数) |