我正在编写一个库,并希望在远程系统返回错误时返回错误代码。问题是这些是由字符串标识的,例如" 0A01"并且还包含一条消息,错误代码需要一个整数作为值。
实现错误代码的最佳方法是什么,std::error_code
提供但使用字符串作为值的所有功能?如何将外部错误字符串添加到std::error_code
或std::error_category
?
答案 0 :(得分:3)
如评论中所述,您必须知道可以从远程服务器接收的错误代码。
您从远程服务器收到的std::string
包含2个部分,如您所说,
问题是这些是由字符串标识的,例如" 0A01"并且还包含一条消息,错误代码需要一个整数作为值。
由于您还没有共享错误消息的格式,我没有添加用于执行spiting的代码,将您的字符串拆分为两部分,
现在,您可以使用std::string
将int
类型的错误代码转换为std::stoi(error_code)
,让我们说
int error_code_int = std::stoi(string_to_hexadecimal(error_code));
对于std::error_category
作为我们的自定义错误消息的基类,请执行此操作,
std::string message_received = "This is the message which received from remote server.";
struct OurCustomErrCategory : std::error_category
{
const char* name() const noexcept override;
std::string message(int ev) const override;
};
const char* OurCustomErrCategory::name() const noexcept
{
return "Error Category Name";
}
std::string OurCustomErrCategory::message(int error_code_int) const
{
switch (error_code_int)
{
case 1:
return message_received;
default:
return "(unrecognized error)";
}
}
const OurCustomErrCategory ourCustomErrCategoryObject;
std::error_code make_error_code(int e)
{
return {e, ourCustomErrCategoryObject};
}
int main()
{
int error_code_int = std::stoi(string_to_hexadecimal(error_code)); // error_code = 0A01
ourCustomErrCategoryObject.message(error_code_int);
std::error_code ec(error_code_int , ourCustomErrCategoryObject);
assert(ec);
std::cout << ec << std::endl;
std::cout << ec.message() << std::endl;
}
上述工作示例的输出是
Error Category Name : 0A01
This is the message which received from remote server.
您可以使用this post中的string_to_hexadecimal()
功能。
我希望您现在可以根据需要修改上述代码。
修改1:
正如你所说:
这假设动态消息是全局值。我如何通过它 到
std::error_category
对象?
您可以看到std::error_code::assign
和构造函数std::error_code::error_code
的参数均为int
,错误代码编号为error_category
。因此std::error_code
显然无法接收动态消息。
但是等等,我说std::error_code
在构造函数中将error_category
作为参数,所以有什么办法,我们可以在那里分配动态消息吗?
std::error_category
用作特定错误的基类 类别类型。
所以这意味着我们从struct
派生的std::error_category
位于以下一行
struct OurCustomErrCategory : std::error_category
可以有一个数据成员,我们可以通过成员函数分配它,所以我们的struct
会变成这样,
struct OurCustomErrCategory : std::error_category
{
std::string message_received;
OurCustomErrCategory(std::string m) : message_received(m) {}
const char* name() const noexcept override;
std::string message(int ev) const override;
};
你可以在任何你想要的地方分配它,
const OurCustomErrCategory ourCustomErrCategoryObject("This is the message which received from remote server.");
答案 1 :(得分:0)
不要将error_code子类化。您需要编写自己的错误类别,它将整数映射到您的特定错误。这是如何执行此操作的逐步说明:
http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-4.html