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

三.标准库的异常

相关推荐
小玮看世界2 分钟前
[Python]动态规划三步走:从爬楼梯到打家劫舍,再到最大子数组和
开发语言·python·动态规划
AI视觉网奇6 分钟前
3d子部件高亮选中
开发语言·javascript·3d
汉克老师11 分钟前
CSP-J 初赛(以满分为目标):第二十一课 《树与二叉树基础—— 一棵树,为什么会成为计算机最重要的数据结构之一?》
c++·csp-j·小学生·学c++编程
zzzll111115 分钟前
深入理解 Java HashMap:从原理到实战
java·开发语言·哈希算法
猫猫不是喵喵.23 分钟前
Java开发高频面试题汇总(通俗易懂版)
java·开发语言·java高频面试
k4m7v2pz30 分钟前
用 rust-verb-shell 重写进程管理:从 game.sh 到 .rvs 的迁移实录
开发语言·后端·rust
2603_9658966232 分钟前
JavaScript 对象零基础详解|属性、方法、遍历、增删改查
开发语言·javascript·ecmascript
别动我齐刘海33 分钟前
从0到1独立搭建机器人软件系统
c++·人工智能·神经网络·opencv·目标检测·机器学习·机器人
dear_bi_MyOnly37 分钟前
数组字符串深度解析:从入门到卡牌实战
开发语言·c++·学习
正在走向自律41 分钟前
从 Python 基础到大模型落地:读《深入浅出 Python 人工智能》,吃透 AI 工程化 CRUD 实战
开发语言·人工智能·python·机器学习·知识脉络