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