对C++异常一些深入的讨论

异常

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 当前的异常声明为 则允许所有异常,这样扩大了原来允许的异常范围,所以发生了错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值