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

三.标准库的异常

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法