C++(17)——异常
异常1. C语言传统的处理错误的方式1. 终止程序如 assert2. 返回错误码2. C异常概念异常是一种处理错误的方式当一个函数发现自己无法处理的错误时就可以抛出异常让函数的直接或间接的调用者处理这个错误throw当问题出现时通过throw关键字抛出异常catch用于捕获异常可以有多个catch进行捕获trytry块中代码表示将被激活的特定异常后面通常跟着一个或多个catch块try { // 保护的标识代码 }catch( ExceptionName e1 ) { // catch 块 }catch( ExceptionName e2 ) { // catch 块 }catch( ExceptionName eN ) { // catch 块 }3. 异常的使用3.1 异常的抛出和捕获3.1.1 异常的抛出和匹配原则1. 异常是通过抛出对象而引发的该对象的类型决定了应该激活哪个catch的处理代码2. 被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个3. 抛出异常对象后会生成一个异常对象的拷贝因为抛出的异常对象可能是一个临时对象这个拷贝的临时对象会在被catch以后摧毁类似于函数传值返回的处理4. catch(...)可以捕获任意类型的异常但是不知道异常错误是什么5. 抛出的派生类对象可以使用基类捕获3.1.2 在函数调用链中异常1. 先检查throw本身是否在try块内部如果是再查找匹配的catch语句如果有匹配的则调到catch的地方进行处理2. 没有匹配的catch则退出当前函数栈继续在调用函数的栈中进行查找匹配的catch3. 如果到main函数的栈依旧没有匹配则终止程序。上述过程称为栈展开。实际中在最后都要加上一个catch(...)捕获任意类型的异常以防止程序被终止4. 找到匹配的catch子句并处理后会继续沿着catch子句后面继续执行3.2 异常的重新抛出有可能单个的catch不能完全处理一个异常可以通过重新抛出将异常传递给更上层的函数进行处理double Division(int a, int b) { // 当b 0时抛出异常 if (b 0) { throw Division by zero condition!; } return (double)a / (double)b; } void Func() { // 这里可以看到如果发生除0错误抛出异常另外下面的array没有得到释放。 // 所以这里捕获异常后并不处理异常异常还是交给外面处理这里捕获了再 // 重新抛出去。 int* array new int[10]; try { int len, time; cin len time; cout Division(len, time) endl; } catch (...) { cout delete [] array endl; delete[] array; throw; } // ... cout delete [] array endl; delete[] array; } int main() { try { Func(); } catch (const char* errmsg) { cout errmsg endl; } return 0; }3.3 异常安全1. 构造函数完成对象的构造和初始化最好不要在构造函数中抛出异常否则可能导致对象不完整或没有完全初始化2. 析构函数主要完成资源的清理最好不要在析构函数中抛出异常否则可能导致资源泄漏3.4 异常规范// 这里表示这个函数会抛出A/B/C/D中的某种类型的异常 void fun() throw(ABCD); // 这里表示这个函数只会抛出bad_alloc的异常 void* operator new (std::size_t size) throw (std::bad_alloc); // 这里表示这个函数不会抛出异常 void* operator delete (std::size_t size, void* ptr) throw(); // C11 中新增的noexcept表示不会抛异常 thread() noexcept; thread (thread x) noexcept;若无异常接口声明则此函数可以抛出任何类型的异常4. 自定义异常体系实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理定义一套继承的规范体系以防随意抛异常。例如// 服务器开发中通常使用的异常继承体系 class Exception { public: Exception(const string errmsg, int id) :_errmsg(errmsg) ,_id(id) {} virtual string what() const { return _errmsg; } protected: string _errmsg; int _id; }; class HttpServerException : public Exception { public: HttpServerException(const string errmsg, int id, const string type) :Exception(errmsg, id) , _type(type) {} virtual string what() const { string str HttpServerException:; str _type; str :; str _errmsg; return str; } private: const string _type; }; void HttpServer() { // ... srand(time(0)); if (rand() % 3 0) { throw HttpServerException(请求资源不存在, 100, get); } else if (rand() % 4 0) { throw HttpServerException(权限不足, 101, post); } } int main() { while (1) { this_thread::sleep_for(chrono::seconds(1)); try{ HttpServer(); } catch (const Exception e) // 这里捕获父类对象就可以 { // 多态 cout e.what() endl; } catch (...) { cout Unkown Exception endl; } } return 0; }5. C标准库的异常体系C提供了一系列标准的异常它们以父子类层次结构组织起来的6. 异常的优缺点优点1. 可以更清晰准确的展示出错误的各种信息甚至包含堆栈调用的信息可以帮助更好的定位程序的bug2. 异常体系中在函数调用链中深层的函数返回了错误不需要层层返回直接可以拿到错误3. 部分函数使用异常更好处理比如T operator[]这样的函数如果pos越界了只能使用异常或者直接终止程序处理无法通过返回值表示错误缺点1. 异常会导致程序的执行流乱跳非常混乱导致跟踪调试分析程序比较困难主要缺点2. 异常会有一些性能开销。在现代硬件速度很快的情况下可以基本忽略不计3. C没有垃圾回收机制资源需要自己管理。异常非常容易导致内存泄漏、死锁等异常安全问题需要RAII来处理资源的管理问题学习成本较高4. C标准库的异常体系定义得不好导致大家自定义各自的异常体系比较混乱5. 异常需要规范使用否则会很麻烦。两点规范1. 抛出异常类型都继承自一个基类 2. 使用func() throw();的方式规范化总结异常利大于弊鼓励使用异常并且OO的语言都是用异常处理错误的

相关新闻

部件适配新模式:网迅科技基于南向部件规范的1GE网卡适配实战

部件适配新模式:网迅科技基于南向部件规范的1GE网卡适配实战

作者: 王晨 北京网迅科技有限公司工程师,openUBMC Component Drivers SIG Maintainer。深入参与openUBMC南向部件驱动开发。 引言 在服务器硬件生态飞速发展的今天,BMC(基板管理控制器)作为硬件远程管控的核心中枢&…

2026/10/24 14:17:16 阅读更多 →
【白嫖指南】WandEnhancer免费解锁WeMod专业版,新手三步上手

【白嫖指南】WandEnhancer免费解锁WeMod专业版,新手三步上手

【白嫖指南】WandEnhancer免费解锁WeMod专业版,新手三步上手 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 游戏打到一半被卡关&#…

2026/10/25 10:46:18 阅读更多 →
2024年网站企业文化建设深度解析:从价值观落地到团队凝聚力的实战指南

2024年网站企业文化建设深度解析:从价值观落地到团队凝聚力的实战指南

说到企业文化,很多人第一反应可能觉得这就是挂在墙上那几句光鲜亮丽的口号,或者是团建时大家一起喊的激昂誓词。甚至有些人会觉得,这玩意儿虚得很,能当饭吃吗?能直接帮公司赚到钱吗?作为一名在这个行业摸爬滚打多年的老兵,我想非常真诚地告诉大家:如果你只把企业文化当…

2026/10/25 3:32:35 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/28 7:28:00 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/28 9:02:11 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/28 9:00:54 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/28 7:29:02 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 9:01:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →