Обработка исключений в Повышении. Asio

Повышение. Документация Asio предлагает следующий шаблон обработки исключений:

boost::asio::io_service io_service;
...
for (;;)
{
  try
  {
    io_service.run();
    break; // run() exited normally
  }
  catch (my_exception& e)
  {
    // Deal with exception as appropriate.
  }
}

Проблема с ним состоит в том, что контекст исключения потерян в точке, когда это обрабатывается. Например, если у меня есть несколько сессий сокета в данном io_service, я не знаю, какой вызвал исключение.

Во что был бы лучший способ обработать исключения от асинхронных обработчиков, не перенося их try/catch блоки?

10
задан Alex B 18 June 2010 в 00:55
поделиться

1 ответ

Нет ничего плохого в шаблоне, рекомендованном Boost.Asio. Что вам следует сделать, так это упаковать всю необходимую информацию для обработки исключения вместе с объектом исключения. Если вы используете boost::exception (или тип, производный от него) для обработки исключений, вы можете легко прикрепить метаданные (включая информацию о сессии), создав специализацию boost::error_info и присоединив ее к объекту исключения с помощью operator<<. Ваш блок catch может затем извлечь эту информацию с помощью get_error_info.

14
ответ дан 3 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: