C++ 异常机制分析.pdf
文本预览下载声明
C++ 异常机制分析
阅读目录
C++异常机制概述
throw 关键字
异常对象
catch 关键字
栈展开、RAII
异常机制与构造函数
异常机制与析构函数
noexcept 修饰符与noexcept 操作符
异常处理的性能分析
C++异常机制概述
异常处理是C++的一项语言机制,用于在程序中处理异常事件。异常事件在C++中表示为异
常对象。异常事件发生时,程序使用throw 关键字抛出异常表达式,抛出点称为异常出现点,
由操作系统为程序设置当前异常对象,然后执行程序的当前异常处理代码块,在包含了异常出
现点的最内层的try 块,依次匹配catch 语句中的异常对象(只进行类型匹配,catch 参数有
时在catch 语句中并不会使用到)。若匹配成功,则执行catch 块内的异常处理语句,然后接
着执行try...catch...块之后的代码。如果在当前的try...catch...块内找不到匹配该异常对
象的catch 语句,则由更外层的try...catch...块来处理该异常;如果当前函数内所有的
try...catch...块都不能匹配该异常,则递归回退到调用栈的上一层去处理该异常。如果一直退
到主函数main()都不能处理该异常,则调用系统函数terminate()终止程序。
一个最简单的try...catch...的例子如下所示。我们有个程序用来记班级学生考试成绩,考试成
绩分数的范围在0-100 之间,不在此范围内视为数据异常:
int main ()
{
int score=0;
while (cin score)
{
try
{
if (score 100 || score 0)
{
throw score;
}
//将分数写入文件或进行其他操作
}
catch (int score)
{
cerr 你输入的分数数值有问题,请重新输入!;
continue;
}
}
}
throw 关键字
在上面这个示例中,throw 是个关键字,与抛出表达式构成了throw 语句。其语法为:
throw 表达式;
throw 语句必须包含在try 块中,也可以是被包含在调用栈的外层函数的try 块中,如:
//示例代码:throw 包含在外层函数的try 块中
void registerScore (int score)
{
if (score 100 || score 0)
throw score; //throw 语句被包含在外层main 的try 语句块中
//将分数写入文件或进行其他操作
}
int main ()
{
int score=0;
while (cin score)
{
try
{
registerScore(score);
}
catch (int score)
{
cerr 你输入的分数数值有问题,请重新输入!;
continue;
}
}
}
执行throw 语句时,throw 表达式将作为对象被复制构造为一个新的对象,称为异常对象。异
常对象放在内存的特殊位置,该位置既不是栈也不是堆,在window 上是放在线程信息块TIB
中。这个构造出来的新对象与本级的try 所对应的catch 语句进行类型匹配,类型匹配的原则
在下面介绍。
在本例中,依据score 构造出来的对象类型为int,与catch(int score)匹配上,程序控制权
转交到catch 的语句块,进行异常处理代码的执行。如果在本函数内与catch 语句的类型匹配
不成功,则在调用栈的外层函数继续匹配,如此递归执行直到匹配上catch 语句,或者直到
main 函数都没匹配上而调用系统函数terminate()终止程序。
当执行一个throw 语句时,跟在th
显示全部