How to countercheck a Boost Error Code appropriately?

Toby picture Toby · Feb 10, 2012 · Viewed 11.9k times · Source

I have a callback function which is bound to a boost::asio::deadline_timer. Now the function is called when the timer is cancelled or it expires. Since I need to distinguish between this two cases I need to check the passed Error code. The basic code would be like this:

void CameraCommand::handleTimeout(const boost::system::error_code& error)
{
    std::cout << "\nError: " << error.message() << "\n";
    return;
}

Now when the Handler is called because the timer expired the error code is Success, when the timer is cancelled the error code is Operation canceled.

Now my question would be, how to appropriately check what happened?

Suggestion 1:

if( error.message() == "Success" )
{
     // Timer expired
}
else
{
     // Timer cancelled
}

Suggestion 2:

if( error.value() == 0 )
{
     // Timer expired
}
else
{
     // Timer cancelled
}

Now my question is - is there any way to compare the error byitself and not by value or by string? Something like ( this is made up now )

if ( error == boost::system::error::types::success )

Because what I don't like about the first suggestion is that I need to create a string just for check, which is kinda unnecessary in my opinion. The second way has the disadvantge that I need to look up all the error codes if I want to check for something other? So are there any enums or ways to check for the error or do I have one of the two suggested ways?

Answer

Scott Langham picture Scott Langham · Feb 10, 2012

Looking at the documentation, you can use the enum values:

switch( error.value() )
{
    case boost::system::errc::success:
    {
    }
    break;

    case boost::system::errc::operation_canceled:
    {
      // Timer cancelled
    }
    break;

    default:
    {
       // Assert unexpected case
    }
    break;
}