• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function template
    <exception>

    std::rethrow_if_nested

    namespace std {
      template <class E>
      void rethrow_if_nested(const E& e);
    }
    

    概要

    入れ子になった例外が存在する場合に、入れ子になった例外を送出する

    効果

    Enested_exceptionを継承した型だった場合、以下の処理を行う:

    dynamic_cast<const nested_exception&>(e).rethrow_nested()
    

    そうでなければ何もしない。

    戻り値

    なし

    #include <iostream>
    #include <exception>
    #include <memory>
    
    struct inner_error : public std::exception {};
    struct outer_error : public std::nested_exception {};
    
    // 現在の例外を取得
    template <class T>
    std::shared_ptr<T> get_exception(std::exception_ptr ep)
    {
      try {
        std::rethrow_exception(ep);
      }
      catch (T& e) {
        return std::shared_ptr<T>(new T(e));
      }
      catch (...) {}
      return nullptr;
    }
    
    // 入れ子になってる例外を取得
    template <class T>
    std::shared_ptr<T> get_nested_exception(std::nested_exception& ex)
    {
      try {
        std::rethrow_if_nested(ex); // 入れ子になってる例外を送出
      }
      catch (T& e) {
        return std::shared_ptr<T>(new T(e));
      }
      catch (...) {}
      return nullptr;
    }
    
    int main()
    {
      try {
        try {
          throw inner_error();
        }
        catch (...) {
          // inner_errorを入れ子にしてouter_errorを送出
          std::throw_with_nested(outer_error());
        }
      }
      catch (...) {
        // 外側の例外を取得
        if (std::shared_ptr<outer_error> outer = get_exception<outer_error>(std::current_exception())) {
          std::cout << "outer" << std::endl;
    
          // 入れ子になった例外を取得
          if (std::shared_ptr<inner_error> inner = get_nested_exception<inner_error>(*outer)) {
            std::cout << "inner" << std::endl;
          }
        }
      }
    }
    

    出力

    outer
    inner
    

    バージョン

    言語

    • C++11

    処理系

    参照