繁体   English   中英

std :: error_code的用例

[英]Use cases for std::error_code

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

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

注意, 我理解差异 - stackoverflow上很多问题可以解决这个问题

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

好的 - 但是我很难理解为什么我们会在实践中使用std::error_code 在我看来你要么:

  1. 与一个特定的系统错误报告机制处理(如说, errno从POSIX调用返回或什么的,或者说,一个电话getsockoptSO_ERROR在Linux上),你可以很容易地转换成std::error_condition通过std::errc枚举,应该是可移植的。

  2. 使用用户定义的错误类别,它代表应用程序级别或业务逻辑错误,例如“无效的社会安全号码”或其他 - 这也是std::error_condition的用例。

  3. 处理一些定义自己的错误报告机制的低级接口或库,例如OpenSSL,在这种情况下,您将直接使用特定于平台的错误机制。 在这种情况下,您需要将这些错误转换或映射到std::error_code 但是如果你要经历将这些特定于平台的错误转换为像std::error_code这样的通用错误的麻烦,为什么不转换为std::error_condition呢?

此外,由于POSIX系统错误应该是可移植的,并且因为它们通过std::errc枚举与std::error_condition std::errc ,所以我找不到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 这样,无论它们来自哪个子系统,您都可以将某种类型的所有错误视为相同。

另一方面, error_code恰好包含它源自的子系统的类别。 这对于调试和报告错误很有用:您可能有兴趣知道“权限被拒绝”错误是由于本地文件系统上的访问权限不足还是因为http-downloader-library收到的403错误,并且可能希望将该详细信息放在错误消息中,但您的程序必须以任一方式中止。

构成等价的内容由类别定义; 如果error_code的类别认为error_condition等价, 或者 error_condition的类别认为error_code等价,则operator==为该对error_conditionerror_code返回true 这样,您可以从您自己的错误类别中获取error_code ,并使它们等同于某些泛型或系统error_condition

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM