When you catch a boost::exception, you can call current_exception() to get an exception_ptr object:
#include <boost/exception_ptr.hpp> #include <boost/thread.hpp> #include <boost/bind.hpp> void do_work(); //throws cloning-enabled boost::exceptions void worker_thread( boost::exception_ptr & error ) { try { do_work(); error = boost::exception_ptr(); } catch( ... ) { error = boost::current_exception(); } }
In the above example, note that current_exception() captures the original type of the exception object. The exception can be thrown again using the rethrow_exception() function:
// ...continued void work() { boost::exception_ptr error; boost::thread t( boost::bind(worker_thread,boost::ref(error)) ); t.join(); if( error ) boost::rethrow_exception(error); }
current_exception() could fail to copy the original exception object in the following cases:
Regardless, the use of current_exception() and rethrow_exception() in the above examples is well-formed.