当前位置: 首页 > news >正文

[C++]错误码与Try-catch

💎个人主页:星柚程

🚀精选文章:《MATLAB多目标优化》,《Kaggle:CV、Public LB 》、《我的第一次 Kaggle》、《C++构造传参》、《蛇形机械臂的模拟退火优化》

🛠️专栏建设:|深度学习|、|Python量化|、|C++学习|、|数据结构|

🎯流水不争先,争得是涛涛不绝。

引言

对于无法在本地恢复、需要向上传播或由统一层处理的异常场景,推荐使用 try-catch。对性能敏感、频繁调用或与 C 接口交互的场合,推荐使用错误码或 std::optional/std::expected 等显式返回策略。

详细解析

异常(try-catch)方式

优点

将错误处理与业务逻辑分离,主流程更简洁;

可以跨多个调用层级向上传播错误,无需每层都检查返回值;

标准库和许多现代库(如<filesystem>、std::thread)都使用异常报告错误。

缺点

性能开销:抛出和捕获异常代价较高,不宜在热路径或频繁错误场景使用;

控制流不直观:过度依赖异常可能让代码阅读和调试更难;

需要在项目中统一规范,否则不同模块混用容易遗漏捕获。

适用场景

系统初始化失败、配置文件解析失败、资源分配失败等“异常”情况;

业务逻辑中确实无法就地处理的错误,需要由上层统一拦截并处理。

错误码 / 显式返回

优点

开销小,调用者直接通过返回值判断并处理;

流程清晰,调用者立刻看到可能的错误分支;

易于与 C 接口或性能敏感代码混用。

缺点

业务逻辑容易被大量的if (err) return err;打断,可读性下降;

容易忽略错误码检查,导致隐性错误。

改进方式

使用enum class ErrorCode或std::error_code进行类型安全的错误码;

C++23 引入std::expected<T, E>,可同时携带返回值和错误信息,简化处理。

适用场景

性能关键的底层库、频繁调用的循环体、跨语言边界(C/C++ 混编);

简单的验证或业务分支(如查找不到元素时返回nullptr或错误码)。

混合使用与团队规范

在同一项目或模块中选择一种主要方式并制定规范;

对于公共接口,若库面向 C++ 用户且错误较少、复杂度高,可用异常;若面向 C 用户或嵌入式场景,则用错误码;

内部实现可用错误码,接口抛出异常,借助适配层统一转换。

示例代码

#include <iostream> #include <stdexcept> #include <optional> #include <system_error> // 异常方式 int divideException(int a, int b) { if (b == 0) throw std::runtime_error("除以零错误"); return a / b; } // 错误码方式 enum class ErrorCode { Ok, DivideByZero }; std::pair<ErrorCode,int> divideErrorCode(int a, int b) { if (b == 0) return {ErrorCode::DivideByZero, 0}; return {ErrorCode::Ok, a / b}; } int main() { // 异常处理 try { std::cout << "10 / 2 = " << divideException(10,2) << std::endl; auto res = divideException(10,0); std::cout << "10 / 0 = " << res << std::endl; } catch (const std::exception& e) { std::cout << "捕获异常: " << e.what() << std::endl; } // 错误码处理 auto [ec1, res1] = divideErrorCode(10,2); if (ec1 == ErrorCode::Ok) std::cout << "10 / 2 = " << res1 << std::endl; else std::cout << "错误码方式:除以零" << std::endl; auto [ec2, res2] = divideErrorCode(10,0); if (ec2 == ErrorCode::Ok) std::cout << "10 / 0 = " << res2 << std::endl; else std::cout << "错误码方式:除以零" << std::endl; return 0; }

运行结果:

10 / 2 = 5

捕获异常: 除以零错误

10 / 2 = 5

错误码方式:除以零

代码解读

divideException在除数为零时抛出std::runtime_error,由调用者在try-catch块中捕获并处理;

divideErrorCode返回一个(ErrorCode, int)对,让调用者显式检查ErrorCode并处理错误。

http://www.jsqmd.com/news/1072735/

相关文章:

  • 【第十期】高级进阶篇:自动化与智能化 —— 如何用 Python 和 AI 辅助挖掘漏洞?
  • 项目实训(十一)| 学习路线模块:个性化学习路线生成
  • CAN↔CAN / CAN↔ETH转发到底怎么做?为什么说PduR是“所有通信流量的十字路口”?
  • Linux下的Codex辅助编程
  • 【Linux】进程控制(四)—— 手搓自主shell
  • 【Linux基础】Linux 必学基础指令:echo/cat/ 重定向 / 查找命令全解析
  • 线上Java服务凌晨3点告警,我靠这张排查流程图5分钟解决了故障
  • 阿里通义千问,8元叠加券,真的可以领到,真没有套路,真不用拉人头,实打实的,就是这么简单!
  • 代理IP为什么会被封?从访问行为看风控逻辑
  • 国内热门的AI智能体小程序哪家可靠
  • 信创业务技术全景解析:从项目实施到国密安全,一文读懂信创落地核心技术体系(PPT)
  • 第七章—01—函数的多返回值,02—函数多种参数使用形式
  • 《个人头像上传》二、Preferences用户首选项使用指南
  • Java + MySQL + Navicat Lite打印输出数据库的表信息到控制台
  • 19-线程上下文传播:异步执行为什么容易丢 Trace
  • 基于 Harmony 7.0 应用的滤镜实验室应用首页实现
  • 第七次作业:三层架构IOCDI和mybatis入门
  • TVA在机电产品视觉检测的创新应用(11)
  • 影刀RPA新手速成:7天从零到独立开发自动化流程
  • 无人机三模态视觉融合:RGB、热成像与事件相机的全天候感知方案
  • 告别AI幻觉!WHartTest PE版7大核心升级,让智能测试更懂你
  • 最便宜稳定 GPT5.5 大模型中转平台
  • 手游 BGP 边缘分发部署实战:三网联机延迟优化与 UDP 异常流量过滤配置方案
  • 2026年6月适合个体户的5大微信小程序制作工具
  • 2 建立连接
  • LIVE项目解析:基于图像先验与时间一致性的AI视频编辑技术
  • 高股息投资笔记-股票的人性2
  • MacBook的实用小技巧
  • 华为OD机试真题-预测新能源发电量(C/C++/Py/Java/Js/Go)
  • 企业低价使用 GPT5.5 API 解决方案