原创作者: grantren   阅读:1327次   评论:1条   更新时间:2011-05-26    

异常

1. goto, break, return, continue和异常
 在try块内部, goto, break, return, continue 可以用来转移程序流程, 当这种情况发生时, 在try块内声明的所有变量都会被释放掉.

cpp 代码
  1. lab: try {   
  2.     T1 t1;   
  3.     try {   
  4.         T2 t2;   
  5.         if(condition) goto lab;   
  6.     } catch(...) {   
  7.         // handler2   
  8.     }   
  9. catch(...) {   
  10.     // handler1   
  11. }   

 
 在上面的例子中,当goto语句执行时,会先销毁t2,然后是t1. 这里假定condition语句没有声明变量. 如果在销毁t2时产生了exception, 那么程序的流程会转移到handler2. 如果在销毁t1时产生了exception, 那么程序的流程会转移到handler1.
 
2. 对于构造函数成员初始化表列,如果产生了异常,有专门的语法去处理:

cpp 代码
  1. int f(int);    
  2. class C {       
  3.     int i;       
  4.     double d;       
  5. public:       
  6.     C(intdouble);       
  7. };       
  8.       
  9. C::C(int ii, double id)        
  10. try : i(f(ii)), d(id) {       
  11.     // constructor function body       
  12. }       
  13. catch(...) {       
  14.     // handles exceptions thrown from the ctor-initializer       
  15.     // and from the constructor function body       
  16. }  

 3. 如果一个类的虚函数声明了异常规格,那么所有子类声明这个虚函数的异常规格必须包含在父类所允许的异常范围内,看下面的例子:

cpp 代码
  1. struct Base {   
  2.     virtual void f() throw (intdouble);   
  3.     virtual void g();   
  4. };   
  5.   
  6. struct Derived : Base {   
  7.     void f();               // ill-formed   
  8.     void g() throw(int);    // OK   
  9. };   

 

解释一下,f是一个虚函数,声明位于父类,是一个接口。最初的异常声明规格为throw (int, double),在Derived类中重写了虚拟表,f 当前的异常声明为则允许所有异常,这样扩大了原来允许的异常范围,所以发生了错误。
评论 共 1 条 请登录后发表评论
1 楼 ph4nut 2009-12-30 20:51
對于C++異常,Coding的時候,這三種情況應該都是會很少考慮到的!

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics