std::error_code比throw更轻量,适合高频预期错误;它是值类型、零开销、无RTTI/堆分配、支持多错误域和跨平台语义归一,需谨慎设计error_category边界。
std::error_code 比 throw 更轻量,适合高频错误分支
当错误是预期中频繁发生的(比如网络超时、文件不存在、系统调用返回
),用
会触发栈展开,开销大且不可预测。而
是值类型,仅含两个整数字段:
和
,构造/拷贝零成本,无异常机制的运行时负担。
不依赖 RTTI 或堆分配,编译期确定行为
可安全用于中断处理、实时线程、嵌入式受限环境
和 C 风格 API(如
、
)天然对齐,转换无损
支持多错误域共存,避免 errno 覆盖问题
传统
是全局变量,多次系统调用可能覆盖前一次错误;
把错误值和其语义绑定在同一个对象里,靠
区分来源。例如:
每个 category 控制
、
等行为
用户可派生自
实现自定义错误域(如数据库错误、协议解析错误)
不同 domain 的相同数值不会误判相等(
为 false,即使
相同)
和 std::error_condition 配合实现“逻辑错误抽象”
描述“发生了什么”,
描述“意味着什么”。比如
(Linux)、
(Windows)、
(SSPI)都映射到同一个
条件。
业务层应基于
分支,而非原始
通过
实现跨平台语义归一
避免写
这类不可移植代码
和返回值组合使用时,避免
隐式转换
陷阱
支持隐式构造(如
),但容易掩盖错误未检查问题。更安全的做法是:
Trae win
Trae Windows 官方版本现已全面支持 Win10 和 Win11 系统(64位)。国内开发者可直接访问 Trae 中文官网(trae.cn 或 trae.com.cn),一键下载官方正版 .exe 安装包,享受国内直连的高速稳定体验。安装过程极其简便,双击即可运行,并支持一键无缝导入 VS Code 或 Cursor 的原有主题、快捷键及插件配置。登录支持手机号、微信或稀土掘金账号。内置免费的豆包与 DeepSeek 等顶级大模型,让你开箱即用,轻松开启高效的 AI 智能编程之旅。
下载
立即学习
“
C++免费学习笔记(深入)
”;
函数签名显式返回
引用参数(推荐)
或返回
(C++23)
禁用隐式转换:继承
并删掉
构造函数(需谨慎)
静态检查:启用
(Clang)或类似警告
真正难的是设计 error category 的边界——比如把 HTTP
状态码
塞进 system_category 还是另建 category,这决定了错误能否被上层统一处理。没想清楚这点,后面所有优化都只是搬砖。
EAGAINthrowstd::error_codevalue()category()errnoWSAGetLastError()errnostd::error_codestd::error_categorystd::error_code ec1 = std::make_error_code(std::errc::no_such_file_or_directory); // generic_category
std::error_code ec2 = std::error_code(WSAENOTCONN, system_category()); // Windows 网络错误
ec1.category() != ec2.category(); // truemessage()default_error_condition()std::error_categoryec1 == ec2value()std::error_codestd::error_conditionEPERMACCESS_DENIEDSEC_E_ACCESS_DENIEDstd::errc::permission_deniedstd::error_conditionerror_code.value()category::default_error_condition()if (ec.value() == 13)std::error_codereturn std::errc::invalid_argument;std::error_code&std::expectedstd::error_codeexplicit-Wimplicit-exception-spec-mismatch