Transporting of Exceptions Between Threads
Boost Exception поддерживает транспортировку объектов исключения между нитями посредством клонирования. Эта система похожа наN2179, но поскольку Boost Exception не может полагаться на языковую поддержку, использованиепозволяет_current_исключениеВо время броска требуется использовать клонирование.
Note:
Все исключения, вызванные знакомым повышением функции:бросок_исключениегарантированно вытекают из повышения:исключениеи поддержку клонирования.
Cloning and Re-Throwing an Exception
Когда вы поймаете исключение, вы можете позвонитьcurrent_ Exception, чтобы получитьexception_ptrобъект:
#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();
}
}
В приведенном выше примере обратите внимание, чтоcurrent_ Exceptionфиксирует исходный тип объекта исключения. Исключение может быть повторено с помощью функцииrethrow_ Exception:
// ...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может не скопировать исходный объект исключения в следующих случаях:
- если не хватает памяти, в этом случае возвращаетсяуказывает на экземпляр std::bad_alloc, или
- есливключить_current_исключениене использовался в бросковом выражении, переданном в исходное бросковое заявление, и текущая реализация не имеет необходимой поддержки компилятора для автоматического копирования исключения, в этом случае возвращаемоеисключение_ptrуказывает на примернеизвестного_исключения.
Несмотря на это, использованиеcurrent_исключениеиrethrow_исключениев приведенных выше примерах хорошо сформировано.