(这只是在下的粗浅理解,不足的地方还请谅解,欢迎留言提出,后期理解深入后会加以改进)
异常:异常就是指程序在运行时存在异常行为,这些异常的行为让函数不能正常执行。
异常处理:
当一个函数发现自己无法处理的错误时抛出异常,让函数的调用者直接或间接的处理这个问题
异常的抛出和捕获
1、异常时通过抛出对象而引发的,该对象的类型决定了应该激活哪个处理代码
2、被选中的除磷代码是调用链中与该对象类型匹配且离抛出异常位置最近的那一个
3、抛出异常后会释放局部存储对象,所以被抛出的对象也就还给了系统,throw表达式会初始化一个抛出特殊的异常对
象副本(匿名对象)
C++的异常:
1、throw字句:throw字句用于抛出异常,被抛出的异常可以是C++的内置类型(例如:throw int(1);),也可以是
自定义类型
2、catch字句:每个catch字句都代表着一种异常处理,catch字句用于处理特定类型的异常
3、try 区段:这个区段中包含了可能发生异常的代码,在发生了异常之后,需要通过throw抛出
异常捕获匹配规则
1、允许从非const对象到const的转换
2、允许从派生类型到基类类型的转换
3、将数组转换为指向数组类型的指针,将函数转换为指向函数类型的指针
异常的重新抛出
有可能单个的catch不能完全处理一个异常,在进行一些矫正处理后,希望再交给更外层的调用链函数来处理,catch
则可以通过重新抛出异常传递给更上层的函数进行处理
异常与构造函数。析构函数
1、构造函数完成对象的构造和初始化,需要保证不要再构造函数中抛出异常, 否则有可能导致对象的不完整或没有完全初始化
2、析构函数主要完成资源的清理,需要保证不要在析构函数内抛出异常,否则可能导致资源泄漏
异常的优缺点
优点:
1、异常允许上层应用决定如何处理在底层嵌套函数中发生“不可能发生”的失败,不像错误代码的记录那么模糊
2、应用于很多现代语言中,引入异常使用C++与Python、Java及其他与C++相近的语言更加兼容
3、许多C++第三方库使用异常,关闭异常将导致难以与之结合
4、异常是解决构造函数失败的唯一方案,虽然可以通过工厂函数(factory function)或Init()方法模拟异常,但他们分别需要堆分配或新的“非法”状态
5、在测试框架(testing framework)中异常确实很好用
缺点:
1、异常会导致程序控制流(control flow)通过查看代码无法确定,函数有可能在不确定的地方返回,从而导致代码管理和调试困难
2、异常安全需要RAII和不同的编码实践
3、加入异常是二进制执行代码体积变大,增加了编译时长,还可能增加地址空间压力
4、异常的实用性可能会刺激开发人员在不恰当的时候抛出异常,或者在不安全的地方从异常中恢复