Как правильно сопоставить код ошибки Boost?

У меня есть функция обратного вызова, которая связана с boost::asio::deadline_timer. Теперь функция вызывается, когда таймер отменяется или истекает. Поскольку мне нужно различать эти два случая, мне нужно проверить пройденный код ошибки. Основной код будет следующим:

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

Теперь, когда обработчик вызван, потому что таймер истек, код ошибки - " Success, когда таймер отменен, код ошибки - " Operation canceled.

Теперь мой вопрос будет, как правильно проверить, что произошло?

Предложение 1:

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

Предложение 2:

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

Теперь мой вопрос: есть ли способ сравнить ошибку byitself, а не по значению или по строке? Что-то вроде (теперь это составлено)

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

Потому что то, что мне не нравится в первом предположении, заключается в том, что мне нужно создать строку только для проверки, которая, на мой взгляд, не нужна. Второй способ заключается в том, что мне нужно найти все коды ошибок, если я хочу проверить что-то другое? Итак, есть ли перечисления или способы проверки ошибки или у меня есть один из двух предложенных способов?

Ответ 1

Просмотрев документацию, вы можете использовать значения перечисления:

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

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

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

Ответ 2

Вы можете просто использовать булевский бросок:

if ( error )
{ 
    // Timer has been cancelled - or some other error. If you just want information
    // about the error then you can output the message() of the error.
}
else
{
    ...
}

boost::error_code имеет для этого булевский оператор, посмотрите здесь: http://www.boost.org/doc/libs/1_48_0/libs/system/doc/reference.html#Class-error_code

Ответ 3

Вы можете использовать построенный по умолчанию error_code:

if( error == boost::system::error_code() )