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;
}

wandbox

  • Last modified: 15 months ago