c++异常2
#include<iostream>classA{public:A(void){std::cout<<"A::A()"<<std::endl;}~A(void){std::cout<<"A::~A()"<<std::endl;}};classB:publicA{public:B(void){std::cout<<"B::B(void)"<<std::endl;}~B(void){std::cout<<"B::~B(void)"<<std::endl;}};voidfunc(void){throwA();//这里抛出一个匿名A类对象.//这里调用A的构造函数,直接跳转到},跳转到"}",但是不执行匿名的析构函数std::cout<<"func()"<<std::endl;//这里不执行}intmain(void){try{//这里try和catch都是一个局部作用域,和函数一样func();//直接跳转到'}',但是从func函数里,抛出的异常对象的析构函数//还是不调用std::cout<<"try"<<std::endl;//不执行}catch(A&ex){//这里对异常抛出的异常对象进行捕捉,如果捕捉不到,则//直接跳转到下一个catch语句...,std::cout<<"catchA"<<std::endl;return-1;}//这里执行匿名对象的析构函数std::cout<<"mainendl..."<<std::endl;return0;}
catch子句会根据异常的类型自上而下顺序匹配,而不是最优匹配
catch子句中使用引用接受异常对象,避免拷贝构造的性能开销,同时可以减少浅拷贝的风险
#include<iostream>classA{public:A(){std::cout<<"A::A()"<<std::endl;}~A(){std::cout<<"A::~A()"<<std::endl;}};classB{public:B(){std::cout<<"B::B()"<<std::endl;}~B(){std::cout<<"B::~B()"<<std::endl;}};classC{public:C(){std::cout<<"C::C()"<<std::endl;}~C(){std::cout<<"C::~C()"<<std::endl;}};voidfunc(void){throwC();//调用C的构造函数,直接跳转到'}'}intmain(void){try{func();//直接跳转到'}'}catch(int&ex){//这里发现int&ex=匿名对象,不成立,则直接倒转到转到'}'std::cout<<"catch:int"<<std::endl;//不执行}catch(B&ex){//B&ex=匿名对象,不成立,直接跳转到'}'std::cout<<"catch:B"<<std::endl;//不执行}catch(C&ex){//C&ex=匿名对象,成立,则执行catch体内的语句std::cout<<"catch:C"<<std::endl;//执行}//这里调用匿名对象的析构函数return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。