讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么自定义异常并携带错误码

陌敏同学_7176

陌敏同学_7176

发布时间:2026-10-29 11:25:49

|

147人浏览过

|

来源于php中文网

原创

继承std::exception并添加错误码成员是最直接的方式:定义含m_error_code成员和code()访问函数的类,避免字符串解析;用int或std::error_code(配全局唯一category);抛出用throw XxxException(...),捕获用const XxxException&引用。

c++怎么自定义异常并携带错误码

继承 std::exception 并添加错误码成员是最直接的方式

标准库不提供带错误码的异常基类,所以得自己造一个。关键不是“能不能抛”,而是“抛出去后调用方能不能安全、一致地拿到错误码”。直接在自定义类里加一个 m_error_code 成员(比如 int 或 std::error_code),并提供公开的 code() 访问函数,比靠字符串解析或动态类型判断靠谱得多。

常见错误是只重写 what() 并把错误码塞进字符串里——这样调用方必须做字符串匹配或正则提取,既脆弱又低效。

  • 错误码类型优先选 int(简单场景)或 std::error_code(需对接系统错误或分类时)
  • 构造函数必须能接收错误码,并确保它被存储;别忘了默认构造或拷贝构造时保持成员一致性
  • what() 可以返回格式化后的消息,但不要让它成为唯一信息出口

用 std::error_code 时注意类别(category)必须全局唯一

如果选 std::error_code,光有值不够,还得配一个 std::error_category 子类。否则 error_code.value() 虽然能取到数,但 error_code.category() 会出错,== 比较也会失效——因为两个不同实例的 category 对象地址不同,std::error_code 默认按 category 地址判等。

典型翻车现场:在头文件里定义匿名 std::error_category 子类,然后多个 .cpp 包含它,结果链接时 category 对象重复,比较永远为 false。

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • category 对象必须声明为 static 全局变量,或用函数局部静态对象保证单例
  • 重写 name() 返回稳定字符串(如 "myapp"),message() 按值返回描述
  • 别在异常类里 new 一个 category 实例——生命周期和线程安全都成问题

抛出和捕获时避免切片(slicing)和裸指针管理

写 throw MyException(404); 没问题,但若写 throw new MyException(404); 就危险了:异常对象必须由栈或异常机制自动管理,手动 new 出来会导致内存泄漏(catch 块里没 delete 的机会)。

另一个坑是捕获时用基类值类型:catch (std::exception e) ——这会触发对象切片,自定义的 code() 成员直接消失。必须用引用:catch (const MyException& e) 或至少 catch (const std::exception& e)(但后者拿不到你的错误码,除非你把它塞进 what() 字符串里,又绕回第一坑)。

  • 抛出:永远用 throw XxxException(...);,不用指针、不用 std::move
  • 捕获:优先捕获具体异常类型引用,如 catch (const MyException& e) { e.code(); }
  • 如果必须统一捕获,考虑让所有异常都继承一个带 virtual int code() const = 0; 的基类

错误码语义要明确,别和系统 errno 混用

自定义错误码最好自成体系,比如用负数表示业务错误(-1001 用户不存在,-1002 权限不足),正数留给系统调用返回值。混用 errno 值容易误导:open() 失败抛出 MyException(EACCES),但调用方看到 13 并不能立刻判断这是系统权限错误还是你自定义的“配置文件不可读”。

更隐蔽的问题是跨平台:Windows 的 ERROR_ACCESS_DENIED 是 5,Linux 的 EACCES 是 13,直接透传会让错误码失去可读性和可维护性。

  • 定义枚举或常量集,如 enum class MyAppErrc { kUserNotFound = -1001, kPermissionDenied = -1002 };
  • 在异常构造时显式转换,而不是依赖隐式 int 构造
  • 文档里写清每个码的含义、触发条件、是否可重试——错误码不是数字游戏
错误码本身不难加,难的是整个链路的一致性:抛的地方存得稳,捕的地方取得到,查的时候看得懂。最容易被忽略的是 category 单例和捕获时的引用写法,这两个点一错,前面全白搭。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RabbitMQ 教程手册
RabbitMQ 教程手册

共0课时 | 0人学习

尚学堂ios初级视频教程
尚学堂ios初级视频教程

共77课时 | 21.3万人学习

尚学堂Swift入门视频教程
尚学堂Swift入门视频教程

共44课时 | 16.7万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn