c++之异常

一.概念

c语言处理错误的方式是通过错误码。先将出现的错误编号,然后通过这个错误码(编号)去查询错误信息,这么操作比较麻烦。

异常是c++处理错误的一种方式 ,c++出现错误会抛出一个对象,从而引发异常,这个对象里包含更为详细全面的错误信息。就相当于运行时,程序出问题,但不让它崩溃掉,用一种抛对象的方式来提醒你,程序出问题了。

二.异常的抛出和捕获

1.三个关键字

在看相关概念之前,我们能要先了解三个关键字:try,throw,catch;它们主导了整个抛出,捕获的过程。

Ⅰ.throw

用于抛出任意类型的异常对象。

Ⅱ.try

try+{}用于包裹可能会出错(抛异常)的代码块。监控可能出异常的函数调用。

Ⅲ.catch

用于捕获throw抛出来的那个对象(异常),它必须紧跟在try模块之后,可以重载多个。

catch后的"()"里装的是某个类型的对象,用于与throw过来的对象进行匹配 ,假如对象与某个catch的()里的类型相同且距离抛异常位置距离最近,就用这个catch进行捕获。

2.抛出和捕获相关概念

整个抛异常粗略的流程:

3.栈展开

这里来更细节地探讨整个抛异常的过程。

异常没有被捕获,或是沿着调用函数链查找,已经到了main函数还是没有匹配的match,代码会直接崩掉:

4.查找匹配的处理代码

此处再补充一下catch匹配的细节。

①.兜底机制

为了防止因在整个调用函数链都找不到匹配的match而造成的程序崩溃,这里有了一个能捕获所有类型对象的万能match:

②.其余概念

第二段画方框的地方就是指catch的()里写的是基类的类型,但能去捕获这个基类的不同派生类,去获得不同的结果(异常),这是个多态。就像是报父亲的名号,结果消费的是儿子一样,而且有很多个儿子,每个儿子的消费结果是不一样的。

5.异常的重新抛出

相当于对抛出的对象进行了一次拦截,对某种进行特殊处理,然后再抛出(throw)给外层调用链,再用调用链中的另外catch再次捕获,而其他不做处理的,就直接再抛出(throw)。

6.异常安全

7.异常规范

为了尽可能避免抛异常导致的资源没释放,造成的安全问题,有了一种提醒的方式。就是标注哪个函数会出现抛异常,哪个不会,这样能提早帮助程序员有针对性地设计函数里的资源申请,释放。

传统派c++98和创新派c++11方案的对比:

左右脑互博,会抛异常的函数加个noexcept不会报错,但强行执行,程序会崩:

三.标准库的异常

相关推荐
wuminyu1 分钟前
JDK21解决虚拟线程IO阻塞原理剖析
java·linux·c语言·jvm·c++
MC皮蛋侠客3 分钟前
TDengine C++ 系列(4):时序查询——窗口聚合、插值、连接与时序函数
大数据·c++·tdengine
junuo12 分钟前
10_C++内存分区与动态内存管理
c++·编程语言
菜冻鱼31 分钟前
Python-sklearn-特征工程
开发语言·人工智能·python·机器学习·numpy·matplotlib·sklearn
欧特克_Glodon32 分钟前
OpenCV计算机视觉开发入门与实践<二>:图像噪声与图像处理
c++·图像处理·opencv·计算机视觉
键盘会跳舞39 分钟前
C++:函数对象与 std::function 源码级深度拆解——泛型算法的策略内核与可调用对象统一封装
c++·算法·仿函数
吴声子夜歌1 小时前
正则指引——PHP
开发语言·正则表达式·php
Claire_881 小时前
企业文件管理系统选型技术框架与主流产品对比分析
开发语言·php
Augustzero1 小时前
为什么高性能调度器都在“偷任务”?从无锁队列看懂工作窃取
c++·后端
(Charon)1 小时前
【C++】线程安全队列(三):MPSC无锁队列、atomic与链表节点实现
c++·安全·链表