C+++结束异常的函数terminate

C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,

学会使用terminate函数有助于异常处理

一 当一个异常产生的时候调用terminate函数,代码:

[cpp] view plaincopyprint?

#include <iostream>   
#include <exception>   
using namespace std;  
void on_terminate(){  
 cout<<"terninate function called!"<<endl;  
 cin.get();  
}  
int main(void){  
 set_terminate(on_terminate);  
 throw exception();  
 cout<<"terminate function not called!"<<endl;  
 cin.get();  
 return 0;  
}  

terminate被调用的情况:
1 当发送一个异常,并且构造函数产生异常
2 当发送一个异常,或者析构函数产生异常
3 一个静态对象的构造或者析构发送一个异常
4 以atexit注册的函数发生异常的时候
5 自定义一个异常,但是实际上没有异常产生的时候
6 调用缺省的unexcepted()函数时候
例子说话:

[cpp] view plaincopyprint?

#include <iostream>   
#include <exception>   
using namespace std;  
void on_terminate(){  
 cout<<"terminate function called!"<<endl;  
 cin.get();  
}  
class custom_exception{  
 custom_exception(){  
 }  
 custom_exception(const custom_exception& excep){  
  throw exception();  
 }  
};  
void case_1(){  
 try{  
  throw custom_exception();  
 }  
 catch(...){  
 }  
}  

当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。
同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。

[cpp] view plaincopyprint?

#include<iostream>    
using namespace std;   
class X   
{   
public:   
 class Trouble {};   //注意:类中嵌套类的申明和定义,学习!!!    
  class small: public Trouble {};   
  class big:public Trouble {};//类中的继承!!!    
  void f(){   
  throw big();   
 }   
};   
int main()   
{   
  X x;   
  try{   
    x.f();   
  }   
  catch(X::Trouble &)   
  {   
    cout<<"caught Trouble"<<endl;   
  }   
  catch(X::small&)   
  {   
    cout<<"caught small"<<endl;  
 }   
  catch(X::big&)   
  {   
    cout<<"caught big"<<endl;   
  }   
   return 0;   
}   

如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用…可以捕捉所有的异常,这个应该放到最后面才可以。
省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值