Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::rethrow_if_nested

      From cppreference.com
      <cpp‎ |error
       
       
      Diagnostics library
       
      Defined in header<exception>
      template<class E>
      void rethrow_if_nested(const E& e);
      (since C++11)
      (constexpr since C++26)

      IfE is not a polymorphic class type, or ifstd::nested_exception is an inaccessible or ambiguous base class ofE, there is no effect.

      Otherwise, performs

      if(auto p=dynamic_cast<conststd::nested_exception*>(std::addressof(e)))    p->rethrow_nested();

      Contents

      [edit]Parameters

      e - the exception object to rethrow

      [edit]Notes

      Unlike many related functions, this function isnot intended to be called with astd::exception_ptr but rather an actual exception reference.

      Feature-test macroValueStdFeature
      __cpp_lib_constexpr_exceptions202411L(C++26)constexpr for exception types

      [edit]Possible implementation

      namespace details{template<class E>struct can_dynamic_cast:std::integral_constant<bool,std::is_polymorphic<E>::value&&(!std::is_base_of<std::nested_exception, E>::value||std::is_convertible<E*,std::nested_exception*>::value)>{}; template<class T>void rethrow_if_nested_impl(const T& e,std::true_type){if(auto nep=dynamic_cast<conststd::nested_exception*>(std::addressof(e)))            nep->rethrow_nested();} template<class T>void rethrow_if_nested_impl(const T&,std::false_type){}} template<class T>void rethrow_if_nested(const T& t){    details::rethrow_if_nested_impl(t, details::can_dynamic_cast<T>());}

      [edit]Example

      [edit]

      Demonstrates construction and recursion through a nested exception object.

      Run this code
      #include <exception>#include <fstream>#include <iostream>#include <stdexcept>#include <string> // prints the explanatory string of an exception. If the exception is nested,// recurses to print the explanatory string of the exception it holdsvoid print_exception(conststd::exception& e,int level=0){std::cerr<<std::string(level,' ')<<"exception: "<< e.what()<<'\n';try{        std::rethrow_if_nested(e);}catch(conststd::exception& nestedException){        print_exception(nestedException, level+1);}catch(...){}} // sample function that catches an exception and wraps it in a nested exceptionvoid open_file(conststd::string& s){try{std::ifstream file(s);        file.exceptions(std::ios_base::failbit);}catch(...){std::throw_with_nested(std::runtime_error("Couldn't open "+ s));}} // sample function that catches an exception and wraps it in a nested exceptionvoid run(){try{        open_file("nonexistent.file");}catch(...){std::throw_with_nested(std::runtime_error("run() failed"));}} // runs the sample function above and prints the caught exceptionint main(){try{        run();}catch(conststd::exception& e){        print_exception(e);}}

      Possible output:

      exception: run() failed exception: Couldn't open nonexistent.file  exception: basic_ios::clear

      [edit]See also

      a mixin type to capture and store current exceptions
      (class)[edit]
      throws its argument withstd::nested_exception mixed in
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/error/rethrow_if_nested&oldid=177873"

      [8]ページ先頭

      ©2009-2025 Movatter.jp