如何正确地反复检查Boost错误代码?

时间:2012-02-10 08:53:49

标签: c++ boost error-handling boost-asio

我有一个绑定到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 个答案:

答案 0 :(得分:20)

查看documentation,您可以使用枚举值:

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

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

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

答案 1 :(得分:13)

你可以使用一个布尔强制转换:

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 :(得分:2)

您可以使用默认构造的error_code:

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