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不会报错,但强行执行,程序会崩:

三.标准库的异常

相关推荐
此生决int1 小时前
深入理解C++系列(02)——类和对象(上)
开发语言·c++
zjun10012 小时前
C++:单例模式
c++·单例模式
-银雾鸢尾-6 小时前
C#中的拓展方法
开发语言·c#
guodingdingh8 小时前
软件开发工作问题总结0718
java·开发语言·数据库
优橙教育10 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
同勉共进11 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋11 小时前
C ++ [ hello world ]
c语言·c++·算法
SeaTunnel12 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
碎光拾影12 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库