Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

transporting of exceptions between threads

Boost , ,

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

Boost Exception

Transporting of Exceptions Between Threads

Boost Exception поддерживает транспортировку объектов исключения между нитями посредством клонирования. Эта система похожа наN2179, но поскольку Boost Exception не может полагаться на языковую поддержку, использованиепозволяет_current_исключениеВо время броска требуется использовать клонирование.

Note:

Все исключения, вызванные знакомым повышением функции:бросок_исключениегарантированно вытекают из повышения:исключениеи поддержку клонирования.

Using enable_current_exception at the Time of the Throw

Вот как можно включить клонирование при экспрессии броска (15.1):

#include <boost/exception/info.hpp>
#include <boost/exception/errinfo_errno.hpp>
#include <stdio.h>
#include <errno.h>
struct file_read_error: virtual boost::exception { };
void
file_read( FILE * f, void * buffer, size_t size )
    {
    if( size!=fread(buffer,1,size,f) )
        throw boost::enable_current_exception(file_read_error()) <<
            boost::errinfo_errno(errno);
    }

Конечно,включить_current_исключениеможно использовать с любым типом исключения; нет требования, чтобы оно вытекало из повышения:исключение.

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_исключениев приведенных выше примерах хорошо сформировано.


See also: Boost Exception

Статья transporting of exceptions between threads раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 05:21:13/0.0054328441619873/1