C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,
学会使用terminate函数有助于异常处理
一 当一个异常产生的时候调用terminate函数,代码:
[cpp] view plaincopyprint? #include
#include using namespace std; void on_terminate(){ cout<<"terninate function called!"<
terminate被调用的情况:
1 当发送一个异常,并且构造函数产生异常
2 当发送一个异常,或者析构函数产生异常
3 一个静态对象的构造或者析构发送一个异常
4 以atexit注册的函数发生异常的时候
5 自定义一个异常,但是实际上没有异常产生的时候
6 调用缺省的unexcepted()函数时候
例子说话:
[cpp] view plaincopyprint? #include
#include using namespace std; void on_terminate(){ cout<<"terminate function called!"< 当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。
立即学习“C++免费学习笔记(深入)”;
赣极购物商城网店建站软件系统下载大小仅1兆左右 ,足够轻便的商城系统; 易部署,上传空间即可用,安全,稳定; 容易操作,登陆后台就可设置装饰网站; 并且使用异步技术处理网站数据,表现更具美感。 前台呈现页面,兼容主流浏览器,DIV+CSS页面设计; 如果您有一定的网页设计基础,还可以进行简易的样式修改,二次开发, 发布新样式,调整网站结构,只需修改css目录中的css.css文件即可。 商城网站完全独立,网站源码随时可供您下载
同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。
[cpp] view plaincopyprint? #include
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"< 如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用...可以捕捉所有的异常,这个应该放到最后面才可以。
省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。
相关推荐:










