微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++异常处理:系统函数terminate的调用

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

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

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

  1. [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()函数时候
例子说话:

  1. [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异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。

同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。

  1. [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语句经常用于清理资源并重新抛出所捕获的异常。

相关推荐:

异常处理实例用法

nginx+php-fpm出现502 bad gateway异常解决办法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐