全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】

std::expected 是 C++23 引入的值优先、错误显式的标准化错误处理工具,用于替代返回码或自定义包装类型,适用于文件解析、配置读取等可预期失败场景,不取代异常。

std::expected 是 C++23 引入的标准化错误处理工具,用来替代传统返回码、异常或自定义包装类型(如 std::optional + 状态码),实现“值优先、错误显式”的函数返回风格。它不是万能异常替代品,而是为预期可能失败但不属异常语义的场景(比如文件解析、配置读取、网络响应解码)提供更清晰、更安全、更可组合的返回接口。

std::expected 的基本结构和构造方式

模板形式为 std::expected,其中 T 是成功时携带的值类型,E 是失败时携带的错误类型(通常为 std::error_codestd::string 或自定义错误枚举)。它内部只保存 TE 中的一个,不可同时存在。

  • 成功构造:std::expected ok{42};std::make_expected(42);
  • 失败构造:std::expected err{std::unexpect, "file not found"};std::make_unexpected("timeout");
  • 检查状态:if (res.has_value()) { /* 成功 */ } else { /* 失败,用 res.error() 取错误 */ }

链式调用与错误传播:用 and_then / transform 处理成功路径

当多个操作需按顺序执行、且任一环节失败就终止并透传错误时,and_then 是核心工具。它只在当前为 value 时调用传入的函数,并自动将该函数返回的 expected “扁平化”——避免嵌套 expected,E>

  • auto res = parse_json(str).and_then(validate_schema).and_then(extract_user_id);
  • 每个函数都返回 std::expected,类型需兼容(错误类型最好一致)
  • 若某步返回 unexpected,后续函数不执行,整个链直接返回该错误

错误转换与兜底处理:用 or_else 和 value_or

当需要对特定错误做修复、降级或日志记录时,or_else 接收一个以 const E& 为参数的函数,返回新的 expected;而 value_or 提供简单默认值兜底(仅适用于可默认构造或提供默认值的 T)。

  • auto id = fetch_user_id().or_else([](const std::error_code& ec) { return fallback_user_id(); });
  • int timeout = get_timeout_config().value_or(3000); // 失败时用 3000
  • 注意:value_or 会强制移动或拷贝 T,若 T 构造代价高或不可拷贝,应改用 and_then + 显式判断

与异常、optional 的关键区别和使用边界

std::expected 不取代异常,也不等价于 std::optional

  • 异常用于真正意外、无法局部恢复的错误(如内存耗尽、硬件故障);expected 用于业务逻辑中可预见、可分类处理的失败(如“用户不存在”、“配置缺失”)
  • std::optional 只能表达“有/无值”,无法携带错误原因;expected 明确区分“成功值”和“失败原因”,支持错误类型多态和模式匹配(配合 std::visit 自定义访问器)
  • 函数签名更自文档化:expected parse(const std::string&)bool parse(..., Data& out) 或抛异常更直观、更易组合

不复杂但容易忽略:别把所有函数都改成 expected,优先用于 I/O、解析、校验等天然带失败语义的函数;保持错误类型轻量、可比较、可输出;搭配 std::error_code + std::system_category() 或自定义错误类别,能更好融入系统生态。


# js  # json  # go  # 工具  # c++  # 状态码  # 区别  # String  # if  # 多态  # Error  # const  # auto  # bool  # int  # 接口  # 值类型  # 访问器  # transform  # 自定义  # 链式  # 默认值  # 也不  # 多个  # 适用于  # 不存在  # 只在  # 将该  # 时用 


相关文章: 建站之星如何保障用户数据免受黑客入侵?  招贴海报怎么做,什么是海报招贴?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  宝塔Windows建站如何避免显示默认IIS页面?  建站之星图片链接生成指南:自助建站与智能设计教程  如何在阿里云部署织梦网站?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  高防服务器租用指南:配置选择与快速部署攻略  ,网站推广常用方法?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  nginx修改上传文件大小限制的方法  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何在IIS管理器中快速创建并配置网站?  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  攀枝花网站建设,攀枝花营业执照网上怎么年审?  成都网站制作报价公司,成都工业用气开户费用?  如何登录建站主机?访问步骤全解析  如何通过可视化优化提升建站效果?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何获取免费开源的自助建站系统源码?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  建站主机选虚拟主机还是云服务器更好?  如何用免费手机建站系统零基础打造专业网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  湖北网站制作公司有哪些,湖北清能集团官网?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  如何续费美橙建站之星域名及服务?  建站主机如何选?高性价比方案全解析  建站之星云端配置指南:模板选择与SEO优化一键生成  建站主机CVM配置优化、SEO策略与性能提升指南  建站10G流量真的够用吗?如何应对访问高峰?  如何在Golang中使用replace替换模块_指定本地或远程路径  行程制作网站有哪些,第三方机票电子行程单怎么开?  在线教育网站制作平台,山西立德教育官网?  C#怎么使用委托和事件 C# delegate与event编程方法  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在阿里云香港服务器快速搭建网站?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站之星24小时客服电话如何获取?  如何获取开源自助建站系统免费下载链接?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何快速登录WAP自助建站平台?  已有域名如何快速搭建专属网站?  网站app免费制作软件,能免费看各大网站视频的手机app?  建站为何优先选择香港服务器?  如何快速搭建响应式可视化网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。