Use cases for std::error_code

Use cases for std::error_code

本文关键字:error code std cases for Use      更新时间:2023-10-16

最近我一直在转换一些库以使用C++11中的<system_error>工具。

我很难理解std::error_codestd::error_condition的用例。

请注意,我理解差异-关于stackoverflow,有很多问题涉及差异。

基本区别在于std::error_code应该表示系统或平台特定的错误,而std::error_condition是API或用户界面应该返回的抽象错误。

好吧,但我很难理解为什么我们会在实践中使用std::error_code。在我看来,你要么去:

  1. 正在处理特定于系统的错误报告机制(如比如errno或从POSIX调用返回的东西,或者说调用到getsockopt和Linux上的SO_ERROR(通过假定为可移植的std::errc枚举转换为std::error_condition

  2. 正在使用用户定义的错误类别,该类别表示应用程序级别或业务逻辑错误,如"无效的社会保障号码"或什么-这也是std::error_condition

  3. 处理一些定义了自己的错误报告机制的低级接口或库,例如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的一些示例用例是什么呢?

不久前我自己也在想这个问题,并在这里找到了答案。本质上,error_code用于存储和传输错误代码,而error_condition用于匹配错误代码。

void handle_error(error_code code) {
   if     (code == error_condition1) do_something();
   else if(code == error_condition2) do_something_else();
   else                              do_yet_another_thing();
}

每个error_condition等价于一组error_code,可能来自不同的error_categories。通过这种方式,您可以相同地处理特定类型的所有错误,无论它们来自哪个子系统。

CCD_ 29恰恰包含它所源自的子系统的类别。这对调试和报告错误很有用:您可能有兴趣了解"拒绝权限"错误是因为对本地文件系统的访问权限不足,还是因为您的http下载程序库收到了403错误,并且可能希望在错误消息中提供详细信息,但您的程序必须中止。

对等的构成是由类别来定义的;如果error_code的类别认为error_condition等价,error_condition的类别认为是error_code等价,则operator==为该对error_conditionerror_code返回true。这样,您就可以从自己的错误类别中获得error_code s,并使其等效于某些通用或系统error_condition s。