C++ Primer笔记 - 异常处理

异常处理允许程序中独立开发的部分能够相互通信并且处理在运行时引发的问题。程序中的一部分可以检测出另一部分无法解决的问题,问题检测部分将问题传递给另一部分准备解决错误的程序。

class类型的异常的抛出

异常通过抛出一个对象而引发,对象的类型决定了调用哪部分处理代码。选定的处理程序是调用链中最匹配对象类型并且与异常距离最近的一个

异常的抛出与捕获方式与函数参数的传递相类似。一个异常可以是任何能够传递给非引用形参的对象,这意味着必须能复制该类型的对象。

执行异throw语句时,throw之后的语句将不被执行,相反,控制从throw转移到相匹配的catch部分。该catch可以是同一函数中的局部catch,也可以是位于直接或间接调用异常发生的函数的函数中。

控制从一个位置转移到另一个位置,这其中有两层隐含含义:

(1) 沿着调用链的函数将提前退出;

(2) 通常,在处理异常时,抛出异常部分的块的局部存储已经不存在了。

由于在处理异常时局部存储被释放,故抛出的对象在局部并不存储。相反,throw表达式用于初始化一种特殊的对象,称作异常对象。异常对象由编译器管理,并确保驻留在被调用的任何catch都能访问到的空间里。该对象由throw创建,并由抛出的表达式的副本初始化。异常对象被传递到相应的catch,在异常完全处理之后被销毁。

异常对象通过复制抛出表达式的结果而创建,因此结果必须是一种能够被复制的类型。

异常被抛出时,抛出对象的静态编译时类型决定异常对象的类型。

如果throw表达式抛出的静态类型是对指针的解引用,无论对象的实际类型是什么,异常对象的类型都与指针的静态类型相匹配(如果指针是指向派生类的基类类型的指针,则将只有基类部分被抛出,即抛出的异常对象是基类类型)。

如果抛出的是指针本身,那么必须确保在进入处理程序时指针所指向的对象依然存在。如果指针指向的是一个局部对象,并且处理程序位于另一个函数,那么当执行处理程序时该指针所指向的对象已经不存在了。即使处理程序在同一函数中,也必须确保指针所指向的对象在catch语句处存在。如果指针指向的对象位于在catch语句前就已经退出的块中,那么该局部对象在catch语句之前就已经被销毁。

posted @ 2012-12-26 10:24  longfloat  阅读(170)  评论(0)    收藏  举报