Обработка исключений в Boost.Asio - PullRequest
10 голосов
/ 18 июня 2010

В документации 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 блоки?

1 Ответ

14 голосов
/ 18 июня 2010

В шаблоне, рекомендованном Boost.Asio, нет ничего плохого. Что вы должны сделать, это упаковать любую необходимую информацию для обработки исключения вместе с объектом исключения. Если вы используете boost :: exception (или производный от него тип) для обработки исключений, вы можете очень легко присоединить метаданные (включая информацию о сеансе), создав специализацию boost :: error_info и присоединение его к объекту исключения с помощью оператора <<. Ваш блок catch может затем извлечь эту информацию с помощью <a href="http://www.boost.org/doc/libs/1_43_0/libs/exception/doc/get_error_info.html" rel="noreferrer"> get_error_info .

...