C++异常处理:系统函数terminate的调用
导读:收集整理的这篇文章主要介绍了C++异常处理:系统函数terminate的调用,觉得挺不错的,现在分享给大家,也给大家做个参考。C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的...
收集整理的这篇文章主要介绍了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?#includeiostream> 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异常解决办法
以上就是C++异常处理:系统函数terminate的调用的详细内容,更多请关注其它相关文章!
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: C++异常处理:系统函数terminate的调用
本文地址: https://pptw.com/jishu/593177.html