[英]Use cases for std::error_code
最近我一直在转换一些库来使用C ++ 11中的<system_error>
工具。
我很难理解std::error_code
与std::error_condition
的用例。
注意, 我理解差异 - stackoverflow上有很多问题可以解决这个问题 。
基本区别在于std::error_code
应该表示系统或平台特定的错误,而std::error_condition
是API或用户界面应该返回的抽象错误。
好的 - 但是我很难理解为什么我们会在实践中使用std::error_code
。 在我看来你要么:
与一个特定的系统错误报告机制处理(如说, errno
从POSIX调用返回或什么的,或者说,一个电话getsockopt
与SO_ERROR
在Linux上),你可以很容易地转换成std::error_condition
通过std::errc
枚举,应该是可移植的。
使用用户定义的错误类别,它代表应用程序级别或业务逻辑错误,例如“无效的社会安全号码”或其他 - 这也是std::error_condition
的用例。
处理一些定义自己的错误报告机制的低级接口或库,例如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_condition
和error_code
返回true
。 这样,您可以从您自己的错误类别中获取error_code
,并使它们等同于某些泛型或系统error_condition
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.