0

0

C++中std::expected怎么处理错误_C++23异常处理新方式详解【现代】

冰火之心

冰火之心

发布时间:2026-02-12 19:24:11

|

847人浏览过

|

来源于php中文网

原创

std::expected用于预期可能失败的值传递,异常用于意外不可恢复的错误;判断标准是失败是否属于函数正常契约:文件打开失败等应使用std::expected,内存分配失败等应抛异常。

c++中std::expected怎么处理错误_c++23异常处理新方式详解【现代】

std::expected 不是异常处理的替代品,它和 throw/catch 解决的是不同层次的问题:前者用于**预期可能失败的值传递**,后者用于**意外、不可恢复的错误中断**。混用或强行用 std::expected 替代异常,反而会让错误流混乱。

什么时候该用 std::expected 而不是 throw

核心判断标准是「这个失败是否属于函数正常契约的一部分」。

  • ✅ 适合:std::expected —— 例如文件打开失败(std::filesystem::status)、字符串转数字失败(std::from_chars)、网络请求返回 404 —— 这些是调用者**必须主动检查**的常规分支
  • ❌ 不适合:std::expected —— 例如内存分配失败(newstd::bad_alloc)、栈溢出、std::vector::at 越界 —— 这些是程序逻辑缺陷或资源耗尽,应由异常中止并向上报告
  • ⚠️ 危险信号:如果写 if (auto r = f(); !r.has_value()) throw std::runtime_error(r.error().message());,说明你本该直接抛异常,而非绕一圈包装再解包

std::expected 的构造与错误提取容易踩哪些坑?

常见错误不是语法问题,而是语义误用:

  • 别用 std::string 存错误信息 —— std::expected<int std::error_code></int>std::expected<int std::string></int> 更轻量、可比、可跨模块传递;std::error_code 已经覆盖系统/POSIX/标准库错误域
  • 别在 value() 上裸调用 —— 它在无值时抛 std::bad_expected_access,等价于又引入了异常分支;应先用 has_value() 或直接用 and_then/or_else
  • 注意移动语义:若 T(成功类型)不可移动,std::expected<t e></t> 就不能被移动;同理,E 也需满足可复制或可移动约束,否则编译失败

如何链式处理多个 std::expected 返回值?

避免嵌套 if,优先用 and_thenor_else 实现扁平化错误传播:

TicNote
TicNote

出门问问推出的Agent AI智能硬件

下载

立即学习C++免费学习笔记(深入)”;

auto parse_config() -> std::expected<Config, std::error_code> {
    auto content = read_file("config.json"); // → expected<std::string, ec>
    if (!content) return content; // 直接透传错误
    return parse_json(content.value()); // → expected<Config, ec>
}
// 改成:
auto parse_config() -> std::expected<Config, std::error_code> {
    return read_file("config.json")
        .and_then(parse_json); // parse_json 接收 std::string,返回 expected<Config, ec>
}

关键点:

  • and_then 的回调函数必须返回 std::expected(同错误类型),否则编译不过
  • or_else 用于错误恢复:比如 fallback 到默认配置,此时回调应返回 std::expected<t e></t>,而不是裸 T
  • 不支持像 Rust 那样自动推导错误类型合并;若中间步骤错误类型不同(如 std::error_code vs int),需手动转换或统一错误类型

为什么 C++23 的 std::expected 还不能完全替代 Result 类型生态?

标准版目前缺失几个工程中高频需要的能力:

  • 没有 map / map_error(仅提供 and_then/or_else),想对成功值做变换还得手动解包再重包
  • 不支持从 std::expected<void e></void> 隐式转为 std::expected<t e></t>(即 no-alloc effect 类型),导致 I/O 类函数难以统一返回风格
  • 没有类似 unwrap_or_else 的便捷取值接口,常用模式仍需写 r.has_value() ? r.value() : fallback()
  • 部分编译器(如 GCC 13.2)对 std::expected 的 constexpr 支持不完整,涉及模板推导时可能编译失败

真正落地时,多数项目会先封装一层薄胶水(比如加 mapunwrap_or),而不是直接裸用标准版。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

12

2025.12.22

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

2

2026.02.11

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

708

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

806

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

326

2023.10.25

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

4

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.3万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号