std::nested_exception
- このページでは,C++の
std::nested_exception
について解説する - C++11以降が対象
利用用途
- 例外$E'$の原因となった例外$E$の情報を保ったまま$E'$をthrowする際に使う
使い方
- catchの中からthrowする場合に
std::throw_with_nested
関数を使うだけ- catchの外で使った場合は未定義動作
- 自分の環境だと
std::rethrow_if_nested
の時にstd::terminate
されてしまう
- $E'$から$E$を取得するには,
std::rethrow_if_nested
を使う
#include <exception> #include <iostream> #include <stdexcept> #include <string> void g() { throw std::runtime_error {"なんかやる気出ない"}; } void f() try { g(); } catch (...) { std::throw_with_nested(std::runtime_error {"gのせいで失敗"}); } void print(const std::exception& e) try { std::cout << e.what() << std::endl; std::rethrow_if_nested(e); } catch (const std::exception& e2) { print(e2); } int main() try { f(); return 0; } catch (const std::exception& e) { print(e); return 1; }