C++ Exception機制
阿新 • • 發佈:2018-01-02
eat play call 捕捉 close clas tcl 檢測 hid
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;View Codethrow 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(){View Codethrow 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,也不會進入析構函數。
C++ Exception機制