GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::rethrow_if_nested(3) C++ Standard Libary std::rethrow_if_nested(3)

std::rethrow_if_nested - std::rethrow_if_nested


Defined in header <exception>
template< class E > (since C++11)
void rethrow_if_nested( const E& e );


If E is not a polymorphic class type, or if std::nested_exception is an inaccessible
or ambiguous base class of E, there is no effect.


Otherwise, performs


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


e - the exception object to rethrow


(none)


Unlike many related functions, this function is not intended to be called with a
std::exception_ptr but rather an actual exception reference.


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<const std::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>());
}


Demonstrates construction and recursion through a nested exception object.

// Run this code


#include <iostream>
#include <stdexcept>
#include <exception>
#include <string>
#include <fstream>


// prints the explanatory string of an exception. If the exception is nested,
// recurses to print the explanatory of the exception it holds
void print_exception(const std::exception& e, int level = 0)
{
std::cerr << std::string(level, ' ') << "exception: " << e.what() << '\n';
try {
std::rethrow_if_nested(e);
} catch(const std::exception& nestedException) {
print_exception(nestedException, level+1);
} catch(...) {}
}


// sample function that catches an exception and wraps it in a nested exception
void open_file(const std::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 exception
void 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 exception
int main()
{
try {
run();
} catch(const std::exception& e) {
print_exception(e);
}
}


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


nested_exception a mixin type to capture and store current exceptions
(C++11) (class)
throw_with_nested throws its argument with std::nested_exception mixed in
(C++11) (function template)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.