正如在 cmets 中提到的,您必须知道可以从远程服务器接收到的错误代码。
正如您所说,您从远程服务器收到的std::string 包含两部分,
问题是这些是由字符串标识的,例如“0A01”并且还包含一条消息,并且错误代码需要一个整数作为值。
由于您没有分享错误消息的格式,我没有添加用于吐出它的代码,将您的字符串分成两部分,
- 错误代码
- 错误消息
现在您可以使用std::stoi(error_code) 将std::string 类型的错误代码转换为int,所以可以说
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 声明:
std::error_category 用作特定错误的基类
类别类型。
所以这意味着我们在下面一行从std::error_category派生了struct
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.");