首先来回顾一下在C语言中我们遇到类似异常的问题时候是如何处理的
C语言处理错误的方式?
1.assert直接终止
2.使用errno返回错误码(可以在网上查找错误码库然后查看错误信息)
3.C标准库setjmp/longjmp(这个我没用过,搬书的,好像现在不怎么用了)
C++中异常的处理用到的三个关键字函数
throw:程序抛出异常
catch:捕获异常,一般拥有多个catch进行捕获
try:将会出现异常的代码段放在try{ }中,后面通常跟着多个捕获异常
具体使用方式不会的各类教材都写的都很详细,不搬书了
try和catch既然可以匹配,那我们局具体的的匹配方式是如何实现的
异常的抛出和匹配规则
1.异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码
2.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个
3.抛出的异常对象是一个临时拷贝,因这个拷贝会在catch之后被销毁(类似于函数的return值)
4.catch(...)可以捕获任意类型的异常,但是无法区分所以不能判断异常的属性(一般用来收回空间 防止内存泄漏)
5.匹配并不一定是完全匹配(eg:抛出派生类的对象,使用基类捕获)
在函数调用链中异常栈展开匹配原则
1.寻找try中的throw,并匹配catch
2.没有匹配的catch则退出当前函数栈,继续在调用函数的栈中匹配
3.如果到达main函数的栈中还是无法匹配则终止程序(此处一般会使用catch(...)用来兜底捕获)
以上过程也可称之为栈展开
Key
1.构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化
2.析构函数主要完成资源的清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏
C++中异常的优缺点
优:
1.相对于错误码可以准确的展示出错误的各种信息,帮助定位bug
2.返回错误码的方式需要层层返回,影响效率,但是异常的出现会直接匹配catch
缺:
1.catch机制导致程序的执行流乱跳
2.性能开销
3.容易导致内存泄漏
4.自定义异常会导致混乱