例外処理中かを判定する
C++には98時代から
これは以下のように定義される、boolを返すだけの関数なのですが、
namespace std { bool uncaught_exception() noexcept; }
この関数はある特殊な状況でのみtrueを返します。
それは、こんな状況です。
「例外が投げられてからキャッチされるまでの間、もしくはstd::terminate()を明示的に呼び出してその関数が実際に呼び出されるまでの間でtrueを返す」
こんなのどこで使えばいいのか。これは、tryブロック中で作られたオブジェクトのデストラクタでtrueになるので、オブジェクトがエラー終了した場合の破棄方法の選択として使用できます。
#include <iostream> #include <exception> struct X { ~X() { if (std::uncaught_exception()) { // ロギング std::cout << "エラー発生による破棄" << std::endl; } } }; int main() { try { X x; throw std::exception(); } catch (std::exception& e) { std::cout << "catch" << std::endl; } }
エラー発生による破棄 catch
しかし、実際にはこういう用途では使われず、メタプロ的な特殊用途で使われるんだと思います。
参照:
GotW #47 Uncaught Exceptions
std::uncaught_exception() - cpprefjp