C++异常机制的执行顺序。
在构造函数内抛出异常
/* * ExceptClass.h * * Created on: 2018年1月2日 * Author: jacket */ #ifndef EXCEPTCLASS_H_ #define EXCEPTCLASS_H_ #include <iostream> using std::cout; using std::endl; class ExceptClass { public: ExceptClass(){ cout<<"ExcepClass"<<endl; throw int(1); } void start(){ } virtual ~ExceptClass() { cout<<"~ExcepClass"<<endl; } }; #endif /* EXCEPTCLASS_H_ */
如果外部没有try catch,输出
ExcepClass terminate called after throwing an instance of ‘int‘
如果外部try catch
ExcepClass
Catch
在start()内抛出异常
/* * ExceptClass.h * * Created on: 2018年1月2日 * Author: jacket */ #ifndef EXCEPTCLASS_H_ #define EXCEPTCLASS_H_ #include <iostream> using std::cout; using std::endl; class ExceptClass { public: ExceptClass(){ cout<<"ExcepClass"<<endl; } void start(){ throw int(1); } virtual ~ExceptClass() { cout<<"~ExcepClass"<<endl; } }; #endif /* EXCEPTCLASS_H_ */
如果外部没有try catch
ExcepClass terminate called after throwing an instance of ‘int‘
如果外部try catch
ExcepClass ~ExcepClass Catch
所以,如果在构造函数内抛出异常,析构函数将不被调用。如果在其他函数内抛出异常,析构函数会被调用。
而且如果外部没有try catch不会调用析构函数,说明C++抛出异常后是先回退(好像是栈有关的回退),检测到异常会被捕捉才进入析构函数。
刚试了下有try catch但捕捉类型改为float,也不会进入析构函数。