c++的错误码(error code)和异常(exception)该如何抉择? (Herb Sutter的观点)

老磊吖_7362

老磊吖_7362

2026-01-29

682人浏览

原创

错误码适用于系统级、性能敏感或无法抛异常的场景(如C接口、中断处理、嵌入式裸机);异常适用于现代C++应用逻辑,更安全、易组合、能准确表达“真正意外”。

c++的错误码(error code)和异常(exception)该如何抉择? (herb sutter的观点)

错误码适合系统级、性能敏感或无法抛异常的上下文(如 C 接口、中断处理、嵌入式裸机);异常适合绝大多数现代 C++ 应用逻辑,它更安全、更易组合、更能表达“真正意外”的语义——这正是 Herb Sutter 在 GotW #91 和 C++ 委员会讨论中反复强调的立场。

什么时候必须用 error code?

当调用栈中存在无法捕获异常的边界时,error_code 或整型错误码是唯一选择:

  • C ABI 兼容接口(如导出给 Python 或 Rust 调用的函数),extern "C" 函数不能抛异常
  • 信号处理函数(signal handler)、中断服务例程(ISR),异常机制在这些上下文中未定义行为
  • 内存极度受限环境(如某些嵌入式 RTOS),禁用异常运行时(-fno-exceptions)后,std::error_code 和 std::expected(C++23)成为替代方案
  • 需要精确控制错误传播路径(例如:逐层检查并记录每个子操作的 errno),而异常会跳过中间栈帧

为什么异常在应用层更可靠?

Herb Sutter 指出,用错误码“手动传播”极易遗漏检查,而异常强制你面对错误——不是靠约定,而是靠语言机制:

python-testing-patterns
python-testing-patterns

使用 pytest、fixtures、mock 和测试驱动开发实现全面的测试策略。用于编写 Python 测试、搭建测试套件或实施测试最佳实践。

下载
  • 忘记检查 if (fd == -1) 是静默 bug;未捕获异常则程序终止(可配 std::set_terminate),问题立刻暴露
  • 异常支持资源自动释放(RAII),即使多层嵌套调用也能保证 std::unique_ptr、锁、文件句柄被析构;错误码需手动写 goto cleanup 或重复 if,易出错
  • std::exception_ptr 和 std::nested_exception 可跨线程传递错误上下文;错误码只能传数字,丢失类型、消息、堆栈线索

std::error_code 不是异常的“轻量替代”,而是协作桥梁

Herb 明确反对把 std::error_code& 当作“不抛异常的异常”来滥用。它的设计目标是与系统 API 互操作,不是替代 throw:

  • std::error_code 本身不带堆栈、不支持动态多态;std::system_error 才是它的异常封装,该抛时就该抛
  • 标准库 I/O(如 std::ifstream::open())默认抛异常;但提供 std::ios_base::failbit + clear() 模式供 error-code 用户切换——这是分层设计,不是二选一
  • 混合使用时,推荐:底层系统调用返回 error_code,上层业务逻辑将其转为具名异常(如 throw std::filesystem::filesystem_error(...))
// 正确协作:将 error_code 转为语义化异常
void open_config_file(const std::string& path) {
    std::error_code ec;
    std::ifstream f{path, std::ios::in | std::ios::binary};
    if (!f.good()) {
        std::filesystem::status(path, ec); // 系统调用返回 ec
        if (ec) {
            throw std::filesystem::filesystem_error(
                "cannot open config", path, ec
            );
        }
        throw std::runtime_error("config file empty or invalid");
    }
}

真正难的是界定“意外”——网络超时是意外还是预期分支?Herb 的建议很实在:如果这个错误在绝大多数调用中都不该发生,且调用方无法合理恢复,就该用异常;如果它是常规控制流的一部分(比如“键不存在”之于哈希查找),std::optional 或 std::expected 更贴切。别让错误处理逻辑模糊了业务意图。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python c++ stream 标准库

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2025.12.22

106

5

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

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

2026.02.11

298

16

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

2026.03.05

642

19

Rust 系统编程入门与实战
Rust 系统编程入门与实战

统讲解近年最受关注的系统级编程语言 Rust 的核心知识体系,涵盖 Rust 的安装与 Cargo 项目管理、变量绑定与不可变性设计哲学、所有权(Ownership)/ 借用(Borrowing)/ 生命周期(Lifetime)三大核心概念、结构体/枚举与模式匹配(match)、Trait 特征系统与泛型编程、错误处理(Result/Option)、智能指针(Box/Rc/Arc)、并发编程的无畏并发(Fearless Concurre

2026.05.29

497

21

Rust异步网络服务与Tokio Runtime深度实践
Rust异步网络服务与Tokio Runtime深度实践

本专题围绕 Rust 在高并发网络服务中的应用展开,系统讲解 Tokio 异步运行时、任务调度模型、Future 执行机制以及高性能网络编程方式。结合实际服务端案例,帮助开发者构建低延迟、高可靠的异步服务架构。

2026.06.29

316

13

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

375

14

scripterror怎么解决
scripterror怎么解决

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

2023.10.18

1069

5

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

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

2023.10.25

3540

5

go语言goto的用法
go语言goto的用法

本专题整合了go语言goto的用法,阅读专题下面的文章了解更多详细内容。

2025.09.05

3357

5

热门下载

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

精品课程

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