错误代码与错误条件

Les*_*ire 27 c++ c++11

我不明白为什么我们需要区分错误代码(std::error_code)和错误condition(std::error_condition),它们不是一样的吗?错误条件与错误代码有什么好处?

Jim*_*mbo 14

来自http://en.cppreference.com/w/cpp/error/error_condition

std :: error_condition是一个与平台无关的错误代码.与std :: error_code一样,它由整数值和std :: error_category唯一标识,但与std :: error_code不同,该值不依赖于平台.

因此,优点是您的错误代码并非特定于您正在使用的平台std::error:condition.

std::error_code

每个std :: error_code对象都包含一对源自操作系统或某些低级接口的错误代码

因此,error_code它将引用特定于您的平台,硬件等的东西等.

使用两者可能是有利的.这error_condition是"可移植的抽象",因此将是给用户的通用错误消息,并且error_code将是对特定调试有用的平台相关信息.

[error_condition]的典型实现包含一个整数数据成员(值)和指向std :: error_category的指针.


小智 11

我在这里找到的这个问题最简单的答案是:http://blog.think-async.com/2010/04/system-error-support-in-c0x-part-5.html.

  • class std::error_code- 表示操作(例如系统调用)返回的特定错误值.
  • class std::error_condition- 您想要测试的东西,并且可能会对您的代码做出反应.

我认为它也适用于C++ 11.


Dwa*_*son 6

好的命名对理解有巨大的影响。C++11 中引入了名称非常相似的错误事物动物园……

\n
std::errc            - an error code\nstd::error_code      - a different error code?\nstd::error_condition - yet another kind of error code \nstd::error_category  - a utility helper interface for error codes \n
Run Code Online (Sandbox Code Playgroud)\n

...我必须制作一张思维导图才能将它们全部整理出来:

\n
std::errc              -> std::posix_error_code\nstd::error_code        -> std::platform_dependent_error\nstd::error_condition   -> std::platform_independent_error\nstd::error_category    -> std::error_domain/utility/mapper\nstd::system_category   -> std::platform_dependent_error_domain\nstd::generic_category  -> std::platform_independent_error_domain\nstd::future_errc       -> std::future_error_code\nstd::future_category   -> std::future_error_domain\nstd::io_errc           -> std::iostream_error_code\nstd::iostream_category -> std::iostream_error_domain\n
Run Code Online (Sandbox Code Playgroud)\n

平台相关错误平台无关错误都包含一个代码和一个指向实用程序帮助程序类的指针,以将特定于域的错误代码映射到消息。尽管具有几乎相同的接口{分配、清除、值、消息...},但它们不是从公共基类继承的,这意味着您不能一般地调用其中一个或另一个的方法。\xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f

\n

请注意,这std::error_code不是错误代码,而是错误代码+加上域/类别的组合,而std::errc实际的错误代码(数值)。好主意 - 糟糕的命名。

\n