原创作者: grantren
阅读:1354次
评论:1条
更新时间:2011-05-26
异常
1. goto, break, return, continue和异常
在try块内部, goto, break, return, continue 可以用来转移程序流程, 当这种情况发生时, 在try块内声明的所有变量都会被释放掉.
cpp 代码
- lab: try {
- T1 t1;
- try {
- T2 t2;
- if(condition) goto lab;
- } catch(...) {
- // handler2
- }
- } catch(...) {
- // handler1
- }
在上面的例子中,当goto语句执行时,会先销毁t2,然后是t1. 这里假定condition语句没有声明变量. 如果在销毁t2时产生了exception, 那么程序的流程会转移到handler2. 如果在销毁t1时产生了exception, 那么程序的流程会转移到handler1.
2. 对于构造函数成员初始化表列,如果产生了异常,有专门的语法去处理:
cpp 代码
- int f(int);
- class C {
- int i;
- double d;
- public:
- C(int, double);
- };
- C::C(int ii, double id)
- try : i(f(ii)), d(id) {
- // constructor function body
- }
- catch(...) {
- // handles exceptions thrown from the ctor-initializer
- // and from the constructor function body
- }
3. 如果一个类的虚函数声明了异常规格,那么所有子类声明这个虚函数的异常规格必须包含在父类所允许的异常范围内,看下面的例子:
cpp 代码
- struct Base {
- virtual void f() throw (int, double);
- virtual void g();
- };
- struct Derived : Base {
- void f(); // ill-formed
- void g() throw(int); // OK
- };
解释一下,f是一个虚函数,声明位于父类,是一个接口。最初的异常声明规格为throw (int, double),在Derived类中重写了虚拟表,f 当前的异常声明为则允许所有异常,这样扩大了原来允许的异常范围,所以发生了错误。
1 楼 ph4nut 2009-12-30 20:51