std::uncaught_exception, std::uncaught_exceptions - cppreference.com
提供: cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
| ヘッダ |
||
| (1) | ||
|
|
(C++11未満) | |
|
|
(C++11以上) (C++17で非推奨) (C++20で削除) |
|
|
|
(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() は例外を投げなければ (デストラクタにおけるキャッチされていない例外の数がコンストラクタで観測された値より大きければ)、ガードオブジェクトのデストラクタによって行われます。
例
#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