我想返回boost::system::error_code
指示是否可以解析主机/服务。主机/服务查找失败的原因可能有多种(例如网络连接问题或无效参数)。
应该归还什么?
答案 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&
作为输出参数的重载来让它为你做这件事: