【发布时间】:2015-11-20 19:51:52
【问题描述】:
最近我一直在转换一些库以使用 C++11 中的 <system_error> 工具。
我很难理解 std::error_code 与 std::error_condition 的用例。
注意,我了解其中的区别 - 有 many questions on stackoverflow 可以解决区别。
基本区别在于std::error_code 应该表示系统或平台特定的错误,而std::error_condition 是 API 或用户界面应返回的抽象错误。
好的 - 但我无法理解为什么我们会在实践中使用 std::error_code。在我看来,你要么去:
处理系统特定的错误报告机制(如 比如,
errno或者从 POSIX 调用返回的东西,或者说,一个调用 在 Linux 上使用SO_ERROR到getsockopt),您可以轻松地 通过std::errc枚举转换为std::error_condition,它们应该是可移植的。使用用户定义的错误类别,代表应用程序级别 或业务逻辑错误,例如“无效的社会安全号码”或 不管 - 这也将是一个用例
std::error_condition.处理一些定义了自己的错误报告机制的低级接口或库,例如 OpenSSL,在这种情况下,您将直接使用特定于平台的错误机制。在这种情况下,您需要将这些错误转换或映射到
std::error_code。但是,如果您要将这些特定于平台的错误转换为像std::error_code这样的通用错误,为什么不直接转换为std::error_condition?
此外,由于 POSIX 系统错误应该是可移植的,并且由于它们通过 std::errc 枚举与 std::error_condition 一对一映射,因此我找不到 std::error_code 的任何用例。大多数 Linux/UNIX 系统调用设置errno,它应该可移植地映射到std::error_condition。
所以,我在任何地方都看不到 std::error_code 的任何用例。那么,在哪些示例用例中我们希望使用 std::error_code 而不是 std::error_condition?
【问题讨论】:
-
this不清楚呢?
-
@LightnessRacesinOrbit,这个想法很明确——但我看不到在实践中使用
error_code。您提供的链接说:“每个std::error_code对象都包含一对源自操作系统或某些低级接口的错误代码” - 好的,但是操作系统会给您一个 POSIX 错误(它是可移植的并且可以轻松转换为std::error_condition)或其他类型的低级错误(例如我猜是Win32错误),然后您需要手动映射到std::error_code- 但是有什么用将其映射到error_code? ... -
...如果您需要做一些特定于平台的事情,您可以直接使用平台设施。如果您需要将错误转换为更通用的内容,请使用 error_condition。我只是不明白 error_code 是如何适应这些的。
-
该答案为您提供了一个“实践中”的用例。 “error_condition 是“可移植的抽象”,因此将是提供给用户的通用错误消息,而 error_code 将是对特定调试有用的平台相关信息。” 老实说,我不知道解决不了问题。
-
也许我只是很密集,但我就是不明白。 “error_code 将是对特定调试有用的平台相关信息” ???对我来说,使用
error_code在这里听起来是多余的。实际的平台相关信息本身对特定调试有用。如果您不处理抽象,为什么还要执行转换为 error_code 的额外步骤?
标签: c++ c++11 error-code