Use cases for std::error_code
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
和Linux上的SO_ERROR
(通过假定为可移植的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
的一些示例用例是什么呢?
不久前我自己也在想这个问题,并在这里找到了答案。本质上,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_condition
和error_code
返回true
。这样,您就可以从自己的错误类别中获得error_code
s,并使其等效于某些通用或系统error_condition
s。
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- Visual Studio Code - C++ Debugger 無法啟動
- Visual Studio Code "undefined reference to `WinMain@16'"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 如何在安装了 WSL 的 Visual Studio Code 中修复"g++: error: helloworld.cpp: No such file or directory"?
- 动态数组"error code unspecified launch failure"
- 创建类对象时,我得到"error: linker command failed with exit code 1"
- Boost asio & ssl & error code
- CreateFileMapping error code 8
- OpenGL OBJ Loader Error: EXC_BAD_ACCESS code = 1
- Error code 2556,2040
- 创建 DirectX 10 设备和交换链时的' Error Code: E_FAIL '
- 谷歌模拟的EXPECT_CALL导致"unknown file:error: SEH exception with code 0xc0000005 thrown in the test body"