C++异常机制

本文介绍了C++的异常机制,包括C语言的传统错误处理方式、C++异常的概念和使用。异常是当函数遇到无法处理的错误时抛出的对象,通过抛出和捕获进行错误处理。异常安全涉及构造函数和析构函数中避免异常导致资源泄漏。自定义异常体系有助于规范项目中的异常管理。C++异常具有清晰展示错误信息、简化多层调用处理等优点,但也存在执行流乱跳、异常安全问题和缺乏统一异常体系等缺点。

异常
1.C语言传统的处理错误的方式
1.终止程序,如assert。缺陷:用户难以接受。
2.返回错误码。缺陷:需要程序员自己去查找对应的错误。
3.C标准库中setjmp和longjmp组合。

2.C++异常概念
异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接调用者处理这个错误。
在这里插入图片描述
在这里插入图片描述
3.异常的使用
3.1异常的抛出和捕获

在这里插入图片描述
异常的抛出和捕获原则
a.异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码。
b.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个。
c.抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)
d.catch(…)可以捕获任意类型的异常,问题是不知道异常错误是什么。
e.实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象,使用基类捕获,这个在实际中非常实用。

3.2异常的重新抛出
有可能单个的catch不能完全处理一个异常,在进行一些校正处理以后,希望再交给更外层的调用链函数来处理,catch则可以通过重新抛出将异常传递给更上层的函数进行处理。
在这里插入图片描述
3.3异常安全
a.构造函数完成对象的构造和初始化,最好不要在构造函数中抛出异常,否则可能导致对象不完整或没有完全初始化。
b.析构函数主要完成资源的清理,最好不要在析构函数内抛出异常,否则可能导致资源泄漏(内存泄漏、句柄未关闭等)。
c.C++中异常经常会导致资源泄漏的问题,比如在new和delete中抛出了异常,导致内存泄漏,在lock和unlock之间抛出了异常导致死锁。

3.4异常规范
在这里插入图片描述
4.自定义异常体系
异常在实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用就会混乱,所以在实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。
在这里插入图片描述
在这里插入图片描述
5.异常的优缺点
C++异常的优点

a.相比错误码的方式可以清晰准确的展示出错误的各种信息。
b.多层调用时,不再需要层层处理,最外层直接捕获即可。
c.部分函数使用异常更好处理,比如构造函数没有返回值,不方便用错误码方式处理。
c.很多第三方库都使用异常,那么使用它们也需要使用异常。比如:boost、gtest、gmock等。
d.很多测试框架都使用异常,这样能更好的使用单元测试等进行白盒测试。

C++异常的缺点
a.异常会导致执行流乱跳,会导致我们调试分析程序bug带来一些困难。
b.C++没有垃圾回收机制,资源需要自己管理。有了异常非常容易导致内存泄露、死锁等异常安全的问题。
c.C++标准库的异常体系定义得不好,导致大家各自定义各自的异常体系,非常的混乱。
d.C++可以抛出任意类型的异常,如果没有很好的规范,那么会非常的混乱,所以一般需要定义出继承体系的异常规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值