gpt4 book ai didi

c++ - 将 std::error_code 与非整数值一起使用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:56 25 4
gpt4 key购买 nike

我正在编写一个库,并希望在远程系统返回错误时返回错误代码。问题是它们由字符串标识,例如“0A01”,并且还包含一条消息,错误代码需要一个整数作为值。

实现错误代码的最佳方法是什么,它具有 std::error_code 提供的所有功能,但使用字符串作为值?如何将外部错误字符串添加到 std::error_codestd::error_category

最佳答案

如评论中所述,您必须知道可以从远程服务器接收到的错误代码。您从远程服务器收到的 std::string 包含您所说的两部分,

The problem is that these are identified by strings, eg, "0A01" and also contain a message, and error code requires an integer as value.

由于您没有共享错误消息的格式,我不会添加吐出它的代码,将您的字符串分成两部分,

  1. 错误代码
  2. 错误信息

现在您可以使用 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:

正如你所说:

This assumes the dynamic message is a global value. How do I pass it to an std::error_category object?

你可以看到std::error_code::assign和构造函数 std::error_code::error_code正在采用参数 int 作为错误代码编号和 error_category。所以很明显 std::error_code 不能接受动态消息。

等等,我说过 std::error_codeerror_category 作为构造函数中的参数,那么有什么办法,我们可以在那里分配动态消息吗?

std::error_category 声明:

std::error_category serves as the base class for specific error category types.

所以这意味着我们从 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.");

关于c++ - 将 std::error_code 与非整数值一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43856612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com