Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception handling in Boost.Asio

Boost.Asio documentation suggests the following exception handling pattern:

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

The problem with it is that the context of exception is lost at the point when it's handled. For example, if I have multiple socket sessions in a given io_service, I don't know which one caused the exception.

What would be a better way to handle the exceptions from asynchronous handlers without wrapping them in try/catch blocks?

like image 453
Alex B Avatar asked Jun 18 '10 00:06

Alex B


1 Answers

There is nothing wrong with the pattern recommended by Boost.Asio. What you should do is package any necessary information for handling the exception along with the exception object. If you use boost::exception (or a type derived from it) for your exception handling, you can very easily attach metadata (including session information) by creating a specialization of boost::error_info and attaching it to the exception object using operator<<. Your catch block can then extract this info with get_error_info.

like image 106
Michael Aaron Safyan Avatar answered Oct 02 '22 15:10

Michael Aaron Safyan