news 2026/6/24 12:30:59

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[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并处理错误。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 12:22:47

03. 从零带你学习Linux内核:proc

/proc/loadavg 这一节核心解决一个问题&#xff1a;load average 不是 CPU 使用率。它更像“系统当前有多少任务在排队等资源”。你之前学的 /proc/stat 是算 CPU 使用率&#xff1b;现在的 /proc/loadavg 是看系统负载压力。两者相关&#xff0c;但不是一个东西。1. 先看 /pro…

作者头像 李华
网站建设 2026/6/24 12:20:50

O-RAN中基于Transformer-ESN混合架构的KPI降维与预测优化

1. 项目背景与核心挑战 在6G和下一代网络架构演进中&#xff0c;开放无线接入网(O-RAN)通过解耦式架构和标准化接口&#xff0c;正在重塑无线通信网络的构建方式。这种架构将传统基带单元(BBU)拆分为分布式单元(DU)和集中式单元(CU)&#xff0c;并引入RAN智能控制器(RIC)实现灵…

作者头像 李华
网站建设 2026/6/24 12:16:09

基于Hadoop的番茄小说阅读量数据的分析与运用

摘要 在数字化时代&#xff0c;数据的分析与挖掘为各类行业带来了深远的影响&#xff0c;尤其是在小说阅读平台中&#xff0c;用户行为数据的分析显得尤为重要。番茄小说作为一个快速发展的在线阅读平台&#xff0c;其用户的阅读量数据蕴含着丰富的信息。通过Hadoop这一大数据处…

作者头像 李华
网站建设 2026/6/24 12:13:50

AI开发可观测性实践:构建成本追踪与代码质量监控体系

1. 项目概述&#xff1a;为什么AI开发需要“可观测性”&#xff1f; 最近几年&#xff0c;AI应用开发的热度有目共睹&#xff0c;从大模型API调用到Agent智能体编排&#xff0c;技术栈日新月异。但不知道你有没有发现一个现象&#xff1a;项目初期&#xff0c;大家热情高涨&…

作者头像 李华
网站建设 2026/6/24 12:13:30

基于深度强化学习的多目标SAR无人机智能路径规划实战解析

1. 项目缘起&#xff1a;当SAR任务遇上复杂地形与多目标去年参与一个山区应急测绘项目时&#xff0c;我们遇到了一个典型的“多目标”难题。任务很简单&#xff1a;用搭载合成孔径雷达&#xff08;SAR&#xff09;的无人机&#xff0c;在最短时间内&#xff0c;对一片因山体滑坡…

作者头像 李华