当`boost :: asio :: ip :: tcp :: resolver :: resolve()`失败时,应该提供哪个`boost :: system :: error_code`值?

时间:2011-09-30 15:08:01

标签: c++ boost boost-asio

我想返回boost::system::error_code指示是否可以解析主机/服务。主机/服务查找失败的原因可能有多种(例如网络连接问题或无效参数)。

应该归还什么?

2 个答案:

答案 0 :(得分:5)

您必须提供错误代码和类别才能创建error_code对象。下面是一个示例,假设错误是由于另一台主机拒绝连接:

error_code ec (errc::connection_refused, system_category());
return ec;

使用系统类别时,您还可以将errno值作为错误代码传递。例如:

#include <fstream>
#include <cerrno>
#include <boost/system/system_error.hpp>

void foo ()
{
    ifstream file ("test.txt");
    if (!file.is_open ())
    {
        int err_code = errno;
        boost::system::error_code ec (err_code
            , boost::system::system_category ());
        throw boost::system::system_error (ec, "cannot open file");
    }
}

不幸的是,这个库documented很差,所以我建议你研究header files来解决问题。代码非常简单直接。

如果您的编译器支持C ++ 11并且您愿意使用它,则此功能使其成为标准。据我所知gcc 4.6.1已经有了。这是一个简单的例子:

#include <cerrno>
#include <system_error>

std::error_code
SystemError::getLastError ()
{
    int err_code = errno;
    return std::error_code (err_code, std::system_category ());
}

void foo ()
{
    throw std::system_error (getLastError (), "something went wrong");
}

通常,如果不需要抛出并使用error_code抛出描述系统故障的异常,库会传递system_error对象。使用error_code无异常的另一个原因是当您需要跨不同线程发出错误信号时。但是C ++ 11有a solution for propagating exceptions across threads

希望它有所帮助!

答案 1 :(得分:2)

resolve()以外的地方做到这一点是不可能的。但是你可以通过使用一个以error_code&作为输出参数的重载来让它为你做这件事:

然后返回它设置的error_code。我相信这会在适当时结束errnoh_errno