1. 程式人生 > >C++ Exception機制

C++ Exception機制

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;
        
throw int(1); } void start(){ } virtual ~ExceptClass() { cout<<"~ExcepClass"<<endl; } }; #endif /* EXCEPTCLASS_H_ */
View Code

如果外部沒有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_ */
View Code

如果外部沒有try catch

ExcepClass

terminate called after throwing an instance of int

如果外部try catch

ExcepClass
~ExcepClass
Catch

所以,如果在構造函數內拋出異常,析構函數將不被調用。如果在其他函數內拋出異常,析構函數會被調用。

而且如果外部沒有try catch不會調用析構函數,說明C++拋出異常後是先回退(好像是棧有關的回退),檢測到異常會被捕捉才進入析構函數。

剛試了下有try catch但捕捉類型改為float,也不會進入析構函數。

C++ Exception機制