gpt4 book ai didi

c++ - 复合错误代码?

转载 作者:行者123 更新时间:2023-12-02 15:37:15 25 4
gpt4 key购买 nike

假设我有一个函数(为了简单起见,请忽略它不是异步的)

http_response http_get(string url, std::error_code& ec);

当该函数失败时,它会通过ec返回错误。到目前为止一切顺利。

现在,假设我有另一个多次使用 http_get 的函数:

int calculate_meaning_of_life(std::error_code& ec) {
auto r1 = http_get("foo.com", ec);
if (ec) return 0;
auto r2 = http_get("bar.com", ec);
if (ec) return 0;
return combine(r1, r2);
}

但现在我遇到一个问题,当 calculate_meaning_of_life 函数失败时,我丢失了有关调用 http_get 的信息。

另一种方法可能是我定义自定义错误代码,并按如下方式使用它们:

int calculate_meaning_of_life(std::error_code& ec) {
std::error_code internal_ec;
auto r1 = http_get("foo.com", internal_ec);
if (internal_ec) {
ec = custom_error::failed_at_foo_com;
return 0;
}
auto r2 = http_get("bar.com", internal_ec);
if (internal_ec) {
ec = custom_error::failed_at_bar_com;
return 0;
}
return combine(r1, r2);
}

但是现在我丢失了有关 http_get 内部发生的情况的信息。理想情况下,我想保留所有信息,如下所示:

int calculate_meaning_of_life(std::error_code& ec) {
std::error_code internal_ec;
auto r1 = http_get("foo.com", internal_ec);
if (internal_ec) {
ec = meaning_error(custom_error::failed_at_foo_com, internal_ec);
return 0;
}
auto r2 = http_get("bar.com", internal_ec);
if (internal_ec) {
ec = meaning_error(custom_error::failed_at_bar_com, internal_ec);
return 0;
}
return combine(r1, r2);
}

这样当我运行它并且失败时,我可以获得所有可用的信息。例如:

std::cerr << ec << "\n"; // Would print: "Failed to retrieve foo.com: operation aborted"

据我了解,std::error_code 只是一个 int 和一个指向类别结构的指针,所以我认为没有一种非黑客的方法可以使 std::error_code 中的 int 实际上代表一个结构。

我现在能想到的制作此类复合错误代码的唯一“黑客”方法是滥用该 int 来实际表示多个值。例如。通过“保留”前 K 位用于自定义错误代码,其余的用于“内部”错误代码,或者使用 Cantor's pairing function或类似的东西。

最后的问题是:是否有推荐的方法来构造此类复合错误代码?和/或 WWW 上是否有关于此类复合错误代码的讨论?或者也许还有其他选择?

最佳答案

std::error_code 不被认为是一个很好的解决方案,我认为这是一个糟糕的界面。您确实应该使用对消息进行编码的东西,例如。更改为:

int calculate_meaning_of_life(std::system_error& ec) {

std::system_errorstd::error_code 和消息进行编码。抛出者(在本例中由参数返回)负责编码足够的信息以使异常有用。

关于c++ - 复合错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59625856/

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