【问题标题】:Do we really need std::error_category and std::error_condition?我们真的需要 std::error_category 和 std::error_condition 吗?
【发布时间】:2018-02-02 17:52:37
【问题描述】:

所以,在了解std::error_code 工作原理的过程中,我开始怀疑我们是否真的需要std::error_conditionstd::error_category。我正在尝试实现thisthis 教程中的内容,并且工作量非常大,而且相当脆弱(我目前正试图弄清楚为什么这段代码会导致链接错误与重复符号.

子类化std::error_code,添加message 属性& 方法,然后让std::error_code 与定义错误代码的枚举相比较,不是更容易吗?我很难理解为什么我需要std::error_categorystd::error_condition

【问题讨论】:

  • 在 C++ 中有多种处理错误的方法,没有一种方法是正确的。如果您不需要它,请不要使用它。

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


【解决方案1】:

主要优点是error_code 是一种可复制类型,可以在库之间传递,而无需涉及任何动态内存分配或模板,使其非常轻量级且易于使用。

如果您正在编写一个完全独立的项目,那么是的,当您可以拥有自己的类型时,错误代码和类别似乎过于复杂。

但是,当编写一个供其他人使用的库时,情况会发生变化(例如 ASIO,因为您链接了 think-async.com)。你可以让一个库接收一个error_code 实例,并且它能够干净有效地传递它,而无需了解有关使用该库的代码的任何信息,或者不必对每个错误处理函数进行模板化错误类型。

在这种情况下,错误类别在处理多个错误源时很重要,因为给定的错误代码可能会根据错误源表示两种不同的含义。

编辑:请注意,在您的第一个链接中,类别实际上是单例的。这样做是为了维护轻量级,因为将指针复制到保证永远不会被删除或修改的对象是便宜的、内存安全的和线程安全的。

【讨论】:

  • 我要补充一点,它还可以通过std::system_error 等标准异常类型轻松传输自定义错误代码。使用您的库的客户端代码不需要了解有关您的自定义错误类别的任何信息。他们可以捕获std::system_error 并通过调用std::error_codegeneric 方法,将其写入日志文件,其中包含错误值、您定义的错误类别的名称和字符串您在错误类别中定义的消息将出现。比仅仅输出“错误代码 123”要好得多,因为没有人知道它属于哪个上下文。
猜你喜欢
  • 2016-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多