异常
- 一个函数无法处理一个错误时, 就可以抛出异常
- throw catch try
try{
//这里throw抛出异常
}catch(){
//处理逻辑
}catch(){
//处理逻辑
}
异常的抛出和匹配原则
- 抛出的是异常对象的拷贝,
- 对象的类型决定激活哪个catch代码块
- 会激活离自己最近的且匹配的catch代码块
- 可以抛出派生类对象,用基类捕捉
- catch(…)捕捉任意类型的异常
异常栈展开
- 如果当前栈没有匹配的catch, 则退出当前函数栈,到调用当前函数栈中找
- 知道main函数结束,如果main函数没有匹配的catch, 则终止程序
异常安全
- 不要再构造, 析构中抛异常,构造中抛异常可能会导致对象不完整, 析构中抛异常可能会导致资源泄漏
- 在使用了new时,抛异常肯会导致资源泄漏
- 可能会导致死锁
异常规范
//表示这个函数会抛异常,类型为这两个
void fun()throw(类型1, 类型2);
//表示这个函数不会抛异常
void fun()throw();
异常的优缺点
- 优点
- 相比错误码,能够更好地展示错误信息
- 可以包含堆栈信息,更好地debug
- 可以在当前栈就拿到错误信息,而返回错误码只能在最外层拿到错误信息
- 缺点
- 执行流乱跳
- 可能会导致资源泄漏,死锁等