Каков обычный способ обработки исключений при работе с функциями обратного вызова? - PullRequest
1 голос
/ 23 ноября 2011

У меня есть неблокирующая функция (она сразу возвращается), которая создает новый поток для анализа некоторых данных:

boost::any Parse() throw(ParseException) {
  // parse something
}
typedef void (*HandlerFunc)(boost::any result);
void ParseAsync(HandlerFunc handler) {
  Parser me(*this);
  in_new_thread {
    boost::any result = me.Parse();
    handler(result);
  }
}

Проблема в том, что Parse может выдать исключение. Как обычно C ++ обрабатывает эти исключения? Должен ли я каким-то образом «передать» исключение функции-обработчику?

Ответы [ 2 ]

8 голосов
/ 23 ноября 2011

Новый стандарт C ++ 11 поддерживает ряд средств, облегчающих программирование потоков.

Наиболее интересными в вашем случае являются std::future и std::promise.

Обратите внимание на функцию std::promise::set_exception_*. Это позволяет вам направить исключение за пределы его потока происхождения (примечание std::exception_ptr имеет семантику общего указателя). Вы можете использовать std::current_exception() (в операторе catch), чтобы получить требуемый указатель.

Затем обратите внимание на функцию std::future::get: если promise, из которого извлечено future, имеет исключение вместо значения, то оно выдаст исключение.

Это механизм для передачи исключений из одного потока в другой.

1 голос
/ 23 ноября 2011

В последний раз, когда я делал что-то подобное, я использовал отдельную функцию обратного вызова, которая принимала std::exception const & для обработки исключений.Вы должны остерегаться времени жизни объекта, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...