C++中的错误处理哲学——异常与错误码的战争

简介: C++错误处理经历了从C风格错误码到异常,再到混合模式的演进。这场“战争”没有赢家——两种方式各有适用场景,C++哲学是提供选择而非强制统一。

C++错误处理经历了从C风格错误码到异常,再到混合模式的演进。这场“战争”没有赢家——两种方式各有适用场景,C++哲学是提供选择而非强制统一。理解异常和错误码的权衡,对于设计健壮的API至关重要。
参考:https://detxg.cn/category/medicinal-recipes.html

C风格错误码:函数返回错误码(如-1、EINVAL),通过全局变量errno传递详细信息。调用者必须检查返回值,否则错误被忽略。错误码的优点是明确、无运行时开销、控制流清晰。缺点是错误处理代码充斥主逻辑,容易遗漏检查,返回值无法用于计算结果(需要输出参数)。

C++异常:异常将错误处理与正常逻辑分离。函数抛出异常,调用者可以捕获。异常携带类型和信息,可以沿调用栈向上传播。异常的好处是错误处理集中化、错误类型丰富、构造函数可以报告失败。缺点是运行时开销(即使不抛出)、控制流隐式化、以及异常安全问题。

性能比较:异常在未抛出时几乎零开销(现代实现使用零开销异常表)。抛出时的成本较高(几百到几千CPU周期),因为需要栈展开和查找catch块。错误码的成本始终存在(每次调用检查返回值)。因此,异常适用于错误率低的场景,错误码适用于高频错误场景(如循环中的分配失败)。

异常安全:异常安全代码必须保证抛出异常时不泄漏资源、不破坏不变量。RAII是异常安全的基础——智能指针、锁守卫在栈展开时自动释放资源。异常安全级别:不抛出保证(noexcept)、强保证(操作回滚)、基本保证(资源不泄漏,对象有效)、以及无保证(可能崩溃)。

noexcept承诺:noexcept函数承诺不抛出异常。违反承诺时调用std::terminate。移动构造函数、析构函数、swap等函数应该noexcept,以便标准库使用更高效的实现(如vector重新分配时移动而非拷贝)。
参考:https://detxg.cn/category/seasonal-health.html

错误码的现代化:C++17引入std::optional,表示值或空。C++23引入std::expected,表示值或错误码。expected是错误码的改进版本——强制检查错误(通过error()或value()),支持链式操作(and_then、or_else)。expected与异常互斥,适合需要高性能、显式错误处理的场景。

混合策略:在大型系统中,常见模式是:内部使用异常,边界处转换为错误码。例如,库内部使用异常简化逻辑,API边界捕获异常返回错误码,避免异常跨越模块边界(因为异常在不同编译器/运行时可能不兼容)。
异常与构造函数:构造函数不能返回错误码,失败时只能抛出异常(或设置标志位,但这是反模式)。工厂函数可以返回optional或expected,但无法避免两阶段初始化。
异常与析构函数:析构函数不应抛出异常。如果析构中需要清理资源且可能失败,提供close或flush函数让用户显式调用,析构函数忽略或记录错误。
异常与性能关键代码:在游戏、金融、嵌入式等低延迟领域,异常通常被禁用。Google的C++风格指南禁止使用异常,LLVM也禁用。这些项目使用错误码和断言。
参考:https://detxg.cn/category/food-therapy-basics.html

异常的类型:标准库异常层次:std::exception(基类)、std::runtime_error(运行时错误)、std::logic_error(编程错误)。自定义异常应该继承自std::runtime_error或std::logic_error。what()返回描述字符串,但不建议用于控制流。
线程中的异常:线程函数抛出异常会调用std::terminate。使用std::promise和std::future可以将异常从工作线程传递到主线程。
异常与模板:异常与模板兼容,但异常类型在实例化时才确定。模板代码通常传播异常,不捕获。

最佳实践:
对于可能失败的构造函数,使用异常。
对于析构函数、swap、移动操作,标记noexcept。
在性能关键路径且错误频繁时,使用expected。
在模块边界(如动态库API),使用错误码。
使用RAII管理资源,避免裸new/delete。
捕获异常时使用引用(catch(conststd::exception&e)),避免对象切片。

C++的错误处理没有银弹。异常和错误码共存,开发者需要根据上下文选择。理解两者的权衡,是编写健壮C++代码的关键。
参考:https://detxg.cn

目录
相关文章
|
14天前
|
缓存 网络协议 测试技术
【免费CDN】阿里云ESA免费版配置,10分钟搞定
阿里云ESA免费版0元开通!含CDN加速、DDoS防护、WAF拦截、Bot管理及HTTPS支持,适合个人站与测试环境。6步完成:领额度→加站点→选免费版→配源站→改DNS→验证生效,全程无需付费。
【免费CDN】阿里云ESA免费版配置,10分钟搞定
|
1月前
|
人工智能 弹性计算 自然语言处理
阿里云轻量应用服务器部署OpenClaw应用镜像,以及OpenClaw集成QQ图文教程
本文介绍了购买阿里云轻量应用服务器并部署OpenClaw应用镜像的步骤,包括相关计费说明、购买流程、配置细节及常见问题。还阐述了如何将OpenClaw集成到QQ机器人中,实现自然语言交互,涵盖创建QQ机器人及集成步骤。通过本文,用户能够掌握从本地部署到QQ集成的完整路径,实现定制化AI助理在QQ场景下的高效应用。
|
10天前
|
人工智能 自然语言处理 BI
用办公Agent接管Excel苦力活:跨表匹配、格式清洗、自动图表生成
本文揭秘如何用AI办公Agent自动化处理Excel月度报表:15分钟搞定跨表匹配(模糊+精确双策略)、智能清洗(日期/数字/空白全覆盖)、自动绘图(配色+标题+标签)。告别VLOOKUP、分列、手动调图,让重复劳动归零——真正的效率革命,始于教会机器做脏活。
106 4
|
1月前
|
人工智能 数据可视化 开发工具
给 AI 智能体装了个“黑匣子”,3 秒定位谁该背锅
Agent Blame-Finder 是专治多智能体系统“甩锅难题”的开源黑匣子工具。基于IETF草案JEP/JAC,3秒精准定位故障责任方,支持加密签名、因果链追溯与零侵入集成,堪称AI世界的`git blame`。
150 11
|
1月前
|
人工智能 自然语言处理 安全
1个Skill,让开源变得So Easy
Auto-Convert Project to Open Source 是一款面向 Claude/Cursor 的 AI 编程技能,专治「能跑但不敢开源」的项目。它提供安全扫描、死代码清理、结构规范化、文档对齐与验证流程,全程副本操作、人工决策、可回滚,助你从「在我机器上能跑」迈向真正可维护、可开源。(239字)
140 11
|
1月前
|
边缘计算 人工智能 运维
云边协同 智启未来 | 阿里云 × ZStack 云边一体解决方案正式落地
阿里云与 ZStack 联手推出云边一体解决方案,以 “中心 — 边缘 — 端” 架构,解决传统 IT 延迟、带宽等痛点,覆盖多行业场景,降低成本、保障合规,助力企业数字化转型。
|
8天前
|
存储 人工智能 JSON
Litefuse 正式发布:Agent 可观测与效果评估, 比 Langfuse 成本低 88%
Litefuse 是一个 Agent 可观测与评估平台,兼容 Langfuse SDK 和 100 多个 AI 生态,并支持 Hermes、OpenClaw、Claude Code 等通用 Agent。存储成本比 Langfuse 降低 88%、简化部署架构、Trace 文本检索效率提升 10 倍,帮助团队以更低成本构建可靠的观测平台。
373 9
Litefuse 正式发布:Agent 可观测与效果评估, 比 Langfuse 成本低 88%
|
1月前
|
Web App开发 Windows
FDM下载安装教程:fdm_x64_setup_6.14.2.3973完整使用指南
Free Download Manager(FDM)6.14.2.3973是专为Win系统优化的免费下载利器:支持HTTP/FTP/BT/磁力链,多线程加速达浏览器3–5倍,断点续传、轻量无广告。本文详解安装、浏览器接管、BT下载及限速/批量等实用设置,助你秒变下载高手。
1869 5
|
1月前
|
应用服务中间件
手慢无!阿里云轻量服务器2026最新秒杀价:2核4G配置199元/年,200M带宽不限流
阿里云2026轻量服务器秒杀开启!轻量应用服务器官方页面:https://t.aliyun.com/U/PEdlFP 新用户专享:2核2G低至38元/年(9.9元/月限时抢),2核4G仅199元/年,4核8G/16G分别1159元、1599元/年。全系配200M峰值带宽+不限流量,性价比远超友商。手慢无!
|
1月前
|
人工智能 弹性计算 缓存
2026阿里云轻量应用服务器价格表:38元1年抢2核2G,9.9元1个月、199元1年抢2核4G
阿里云轻量应用服务器以简单易用、高性价比成为个人和普通企业用户的上云首选。2026年轻量应用服务器限时秒杀活动,如38元/年(2核2G)和9.9元/月(2核4G,预装OpenClaw)的抢购配置,覆盖个人开发、企业建站及AI应用部署场景。同时,提供日常配置套餐(2核4G、4核8G等)及长期特价云服务器ECS(99元/年经济型e实例、199元/年通用算力型u1实例),满足稳定需求。用户可根据业务规模和复杂度灵活选择。

热门文章

最新文章