Sil*_*ler 21 c++ error-code c++11
最近我一直在转换一些库来使用<system_error>C++ 11中的工具.
我很难理解std::error_codevs 的用例std::error_condition.
注意,我理解不同之处 - stackoverflow上有很多问题可以解决这个问题.
基本区别在于std::error_code应该表示特定于系统或平台的错误,而std::error_conditionAPI或用户界面应返回的是抽象错误.
好的 - 但是我很难理解为什么我们会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::error_condition通过std::errc枚举一对一映射,所以我找不到任何用例std::error_code.大多数Linux/UNIX系统调用set errno,应该可以移植映射到std::error_condition.
所以,我没有看到任何std::error_code地方的任何用例.那么,我们想要使用的示例用例std::error_code是std::error_condition什么?
ex-*_*art 20
我想知道这一段时间我自己并在这里找到答案.本质上,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();
}
Run Code Online (Sandbox Code Playgroud)
每个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_code从自己的错误类别中获取s,并使它们等同于某些泛型或系统error_condition.
| 归档时间: |
|
| 查看次数: |
8437 次 |
| 最近记录: |