【问题标题】:Error handling. Mapping system error codes to generic错误处理。将系统错误代码映射到通用
【发布时间】:2019-04-05 21:47:21
【问题描述】:

我发现函数 default_error_condition 在我的代码中没有按预期工作

auto ec = std::system_category().default_error_condition(EACCES);
std::cout << ec.value() << std::endl << ec.category().name() << std::endl;

返回的 ec 值具有 system 错误类别,但它必须是 generic,如果我从文档中得到正确的话,例如cppreference和gcc源码system_error.cc

UPD:在标准 19.5.1.5 错误类别对象

中也发现了此注释

对象的 default_error_condition 虚函数的行为如下:

如果参数 ev 对应于 POSIX errno 值 posv,则函数应返回 error_condition(posv, generic_category())。否则,函数将返回 error_condition(ev, system_category())

这里发生了什么?

我在 linux 上使用 g++ 7.3.0

【问题讨论】:

    标签: c++ error-handling g++ std


    【解决方案1】:

    你说得对,因为这个参数,error_condition(ev,generic_category()) 应该从 default_error_condition 返回,因此输出应该是 "generic"

    查看您链接到的源的“历史”,直到最近这是一个 libstdc++ 错误(只是three months ago)。是bug 60555

    乔纳森的结论是:

    已在所有活动分支上修复,因此将在 6.5、7.4、8.3 和 9.1 版本中修复。

    因此,如果您要将 GCC 7.3 升级到 7.4(尚不存在),您会看到预期的行为。

    【讨论】:

    • @NathanOliver 更好? :)
    • 非常好,找到错误报告也很棒。 +1
    • @NathanOliver 感谢您直言不讳。
    • 没问题。直到我阅读标准并认为我会将其提供给您以确认我的想法之前,我并不完全确定自己。 (也感谢您回滚。我看到了)
    • @olpchk 终于到了!
    猜你喜欢
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多