Как правильно проверить контрольный код ошибки? - PullRequest
15 голосов
/ 10 февраля 2012

У меня есть функция обратного вызова, связанная с 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
}

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

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

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

Ответы [ 3 ]

20 голосов
/ 10 февраля 2012

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

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

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

    default:
    {
       // Assert unexpected case
    }
    break;
}
13 голосов
/ 10 февраля 2012

Вы можете просто использовать логическое приведение:

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

2 голосов
/ 20 июня 2014

Вы можете использовать созданный по умолчанию код ошибки:

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