Как правильно сопоставить код ошибки 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() )