异常学习

#include  < exception >
#include 
< iostream >
using   namespace  std;
 
void  terminator()  {
  cout 
<< "I'll be back!" << endl;
  exit(
0);
}

 
void  ( * old_terminate)()  =  set_terminate(terminator);
 
class  Botch  {
public:
  
class Fruit {};
  
void f() {
    cout 
<< "Botch::f()" << endl;
    
throw Fruit();
  }

  
~Botch() throw 'c'; }
}
;
 
int  main()  {
  
try {
    Botch b;
    b.f();
  }
 catch(...) {
    cout 
<< "inside catch(...)" << endl;
  }

}
  ///:~
 
    没catch的异常可以用set_terminate来处理。同时,可以看出在析构函数里抛异常是很郁闷的一件事情。


如果在生成对象时候产生异常,会自己析购已经生成的,而产生异常的那一次生成,没有调用析构函数。
// : C01:Cleanup.cpp
//  Exceptions clean up complete objects only.
#include  < iostream >
using   namespace  std;
 
class  Trace  {
  
static int counter;
  
int objid;
public:
  Trace() 
{
    objid 
= counter++;
    cout 
<< "constructing Trace #" << objid << endl;
    
if(objid == 3throw 3;
  }

  
~Trace() {
    cout 
<< "destructing Trace #" << objid << endl;
  }

}
;
 
int  Trace::counter  =   0 ;
 
int  main()  {
  
try {
    Trace n1;
    
// Throws exception:
    Trace array[5];
    Trace n2;  
// Won't get here.
  }
 catch(int i) {
    cout 
<< "caught " << i << endl;
  }

}
  ///:~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值