我很难理解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的例子是什么呢?
解决方法
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 ==将返回true对于该对error_condition和error_code.这样,您可以从您自己的错误类别中获取error_codes,并使其等同于某些通用或系统错误条件.