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

Документация по Boost.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?


person Alex B    schedule 18.06.2010    source источник


Ответы (1)


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

person Michael Aaron Safyan    schedule 18.06.2010