原文地址:异常抛出(2)throw 、catch
作者:Ma_Hong_Kai
重新抛出:单个catch不能处理一个异常,需再次抛出
重新抛出机理:中断当前的异常处理器的处理,把异常对象沿函数链继续向上传递。
在一个函数中throw 1;
Catch(int n)
{
n = 2;
throw; // 重新抛出 抛出的对象还是1,要改变则要catch(int &n),
}
注:重新抛出不会产生新对象
捕获全部异常:
catch(...)
{
// 处理异常}
注:由于最特殊的异常最先出现,所以catch(...)必须在列表的最后出现
函数与异常:
(1)异常规格说明
void f()throw(int,char) ;
// 只能抛出int 和 char类型的异常,参数多少可变
void f();
// 可抛出任何一种异常
void f() throw();
// 不抛出任何异常
(2)异常安全函数
将可能抛出异常的代码写在函数前面,让异常在改变数重要数据或状态之前抛出。
注:
在catch块中只能抛出院里的异常,不能抛出新的异常;
抛出异常后,在函数调用链上,一直到正确处理此异常前,会将中间函数的战空间释放,而在有对象的函数中会调用析构函数,因此不可在析构函数抛出异常
遇到catch语句,异常处理就终止,因此catch(...)放在catch块末尾。