【问题标题】:How to countercheck a Boost Error Code appropriately?如何适当地反检查 Boost 错误代码?
【发布时间】:2012-03-02 18:21:55
【问题描述】:

我有一个绑定到boost::asio::deadline_timer 的回调函数。现在,当计时器取消或到期时调用该函数。由于我需要区分这两种情况,我需要检查传递的错误代码。基本代码如下:

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

现在当定时器超时调用Handler时错误码为Success,当定时器被取消时错误码为Operation canceled

现在我的问题是,如何适当地检查发生了什么?

建议一:

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

建议二:

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

现在我的问题是 - 有没有办法单独比较错误而不是按值或字符串比较?类似的东西(这是现在编造的)

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

因为我不喜欢第一个建议是我需要创建一个字符串仅用于检查,我认为这有点不必要。第二种方法的缺点是如果我想检查其他内容,我需要查找所有错误代码? 那么是否有任何枚举或方法来检查错误,还是我有两种建议的方法之一?

【问题讨论】:

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


    【解决方案1】:

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

    switch( error.value() )
    {
        case boost::system::errc::success:
        {
        }
        break;
    
        case boost::system::errc::operation_canceled:
        {
          // Timer cancelled
        }
        break;
    
        default:
        {
           // Assert unexpected case
        }
        break;
    }
    

    【讨论】:

    • 嗯,我可能搞错了。这表示我们应该将 error_codes 与 error_conditions 进行比较,并且不应使用 value() 进行比较。 blog.think-async.com/2010/04/…
    • 这是不正确的。 boost error_code 具有类别和值。相同的值可以存在于多个类别中。您必须同时检查两者。
    【解决方案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

    【讨论】:

    • 好的,这对于这个特定的问题是合适的,因为我只想确定它是否已被取消或刚刚过期,if(!error) 是什么意思,但是如何检查特定错误?
    • 需要注意的是,BOOST 的每个部分都会有自己的一组错误代码。查看boost.org/doc/libs/1_48_0/doc/html/boost_asio/reference/…
    • 恕我直言 if (error.value() != boost::system::errc::success) 更精确、更具可读性并且不依赖于布尔运算符覆盖实现,因此被编程为接口,而不是实现。
    • @MartinMeeser 谢谢你的重点。 if (error.value() != boost::system::errc::success) 表示这是一个错误?或者这是否意味着它不是一个错误?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-07-13
      • 2013-01-10
      • 1970-01-01
      • 2014-01-21
      • 2018-07-31
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多