最近我一直在将一些库转换为使用C++11中的<system_error>
设施。
我很难理解std::error_code
和std::error_condition
的使用案例。
注意,我理解它们之间的区别 - 在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
呢?
std::errc
枚举与std::error_condition
一一映射,因此我找不到任何使用std::error_code
的用例。大多数Linux / UNIX系统调用设置errno
,这应该可以可移植地映射到std::error_condition
。因此,我在任何地方都看不到使用std::error_code
的用例。那么,有哪些示例用例,我们希望使用std::error_code
而不是std::error_condition
呢?
error_code
的用处。您提供的链接说:“每个std::error_code
对象都包含一个来自操作系统或某些低级接口的错误代码对”-好吧,但是操作系统将给您提供一个POSIX错误(它是可移植的,可以轻松地转换为std::error_condition
)或其他类型的低级错误(例如我猜测是Win32错误),然后您需要手动将其映射到std :: error_code
- 但是将其映射到error_code
有什么用?... - Silerstd::error_condition
来处理吗? - Siler