【问题标题】:Is std::error_category usable with dynamic messages?std::error_category 可用于动态消息吗?
【发布时间】:2018-02-03 18:02:58
【问题描述】:

我正在开发一个与远程系统通信的库,虽然它返回有限且已知数量的错误代码,但消息可能会以不可预知的方式发生变化。

所以我exploringstd::error_code 是为了向我的库的用户提供一种处理 C++ 本地错误的方法,而不是推出我自己的代码。我不能抛出异常。

Tutorials 在使用 std::error_category 时始终显示使用静态实例,并根据错误代码返回硬编码消息。

但是如果我们有无法缓存的动态消息怎么办?我们如何将特定消息链接到std::error_code 的特定实例?

【问题讨论】:

  • 没有人使用std::error_code
  • @o11c 他们应该这样做。

标签: c++ c++11 error-code


【解决方案1】:

简短的回答:你真的不能这样做。

error_code 是一个可复制的值类型。如果允许自定义消息,则复制错误将涉及对消息数据进行深度复制,或维护引用计数。

这会使错误代码过于繁重而无法在许多应用程序/库内部循环中使用,基本上迫使程序员对这部分代码使用不同的错误处理机制,从而使error_code 基本上毫无意义。

您也许可以通过使用线程本地错误状态(如老派errno)来解决此问题,但我建议您不要这样做,因为它会阻止您在任何时间长度内存储错误。

【讨论】:

  • 除了 std::error_code 和异常,还有 C++ 处理错误的方法吗?
  • @ruipacheco 当然! C++ 是一种足够灵活的语言,您提出的任何错误处理方案都可能是可以实现的。我个人非常喜欢 Andrei Alexandrescu 的 expected<> 方案,但我还没有看到它在生产中使用。
  • @ruipacheco 我的经验是,失败的原因通常只对调试有用,所以返回一个简单的成功/失败状态,并在失败时结合简单的写入日志网站通常是你所需要的,真的。
  • 我的意思是每个人都认为是错误处理的通用接口。正如 asio 示例所示,HTTP 错误代码,但我想返回带有每个错误代码的动态消息。
  • @ruipacheco 你还不如在那个时候使用异常。
猜你喜欢
  • 1970-01-01
  • 2018-02-02
  • 2019-07-23
  • 2015-08-31
  • 2011-03-11
  • 1970-01-01
  • 2018-02-10
  • 2012-10-13
  • 2012-08-08
相关资源
最近更新 更多