您好,登錄后才能下訂單哦!
#include <iostream> #include <iostream> using namespace std; class FileError{}; class MemoryError{}; void foo(void)throw(MemoryError,FileError,int,double); int main(void) { try{ foo(); } catch(FileError& ex){ cout << "file error!" << endl; return -1; } catch(MemoryError& ex){ cout << "memory error!" << endl; return -1; } catch(int ex&){//int類型只能捕捉double,同樣double只能捕捉double. cout << ex << endl; } catch(...){//這里會捕捉所有異常列表的異常對象 cout << "other error!" << endl; return -1; } return 0; } void foo(void)throw(FileError,MemoryError,int,double){//與函數(shù)聲明一樣,不多不少. throw -1; //throw FileError(); }
異常說明:
1)可以在函數(shù)原型中增加異常說明,說明該函數(shù)所有可能拋出的異常類型.
返回類類型 函數(shù)名(形參表)throw(對象1,對象2,...);(這里對象可以為基本類型)
對象1,對象2...被稱為異常說明表
2)函數(shù)的異常說明是一種承諾,表示函數(shù)所拋出的異常不會超出異常說明表,如果超出,將無法被捕獲
即使catch中接受對象的類型也無法被捕獲,最終會被系統(tǒng)捕獲,終止程序.
3)throw;表示可以拋出任何異常,thow();表示不會拋出異常
4)如果函數(shù)申明和定義分開,如果聲明時有異常說明,則定義時也要有異常說明,異常說明表要一模一樣,
當(dāng)然,異常說明表中異常對象的位置可以隨意.
5)如果基類中的虛函數(shù)帶有異常說明,那么該函數(shù)在子類中的覆蓋版本不能在異常說明表中拋出的異常對象不能比基類多(屬于包含關(guān)系)
6)如果構(gòu)造函數(shù)中拋出異常,則對象將不會調(diào)用析構(gòu)函數(shù)(怎么都不會調(diào)用),這時需要手動銷毀在異常之前
7)不允許在析構(gòu)函數(shù)中拋出異常,如果你在析構(gòu)中拋異常,這個類一旦實(shí)例化,就報錯.
所有動態(tài)分配的資源.
#include <iostream> using namespace std; class A{ public: A():m_p(new int(5)){ cout << "A:A()" << endl; delete m_p; throw -1;//析構(gòu)函數(shù)不會調(diào)用,拋出異常前,手動釋放動態(tài)分配的內(nèi)存 } ~A(){ cout << "haha" << endl; delete m_p; } private: int* m_p; }; int main(void){ A a;//這樣就直接報錯. return 0; }
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。