// 代碼清單1-1
1 #include
2 #include
3 double fuc(double x, double y) //定義函數(shù)
4 {
5 if(y==0)
6 {
7 throw y; //除數(shù)為0,拋出異常
8 }
9 return x/y; //否則返回兩個(gè)數(shù)的商
10 }
11 void main()
12 {
13 double res;
14 try //定義異常
15 {
16 res=fuc(2,3);
17 cout<<"The result of x/y is : "< 18 res=fuc(4,0); //出現(xiàn)異常,函數(shù)內(nèi)部會拋出異常 19 } 20 catch(double) //捕獲并處理異常 21 { 22 cerr<<"error of dividing zero.\n"; 23 exit(1); //異常退出程序 24 } 25 } 【范例2】自定義異常類型 (在本文開始的代碼中已經(jīng)給出示范) 三、異常的接口聲明 為了加強(qiáng)程序的可讀性,使函數(shù)的用戶能夠方便地知道所使用的函數(shù)會拋出哪些異常,可以在函數(shù)的聲明中列出這個(gè)函數(shù)可能拋出的所有異常類型,例如: void fun() throw( A,B,C,D);這表明函數(shù)fun()可能并且只可能拋出類型(A,B,C,D)及其子類型的異常。 如果在函數(shù)的聲明中沒有包括異常的接口聲明,則此函數(shù)可以拋出任何類型的異常,例如:void fun(); 一個(gè)不會拋出任何類型異常的函數(shù)可以進(jìn)行如下形式的聲明: void fun() thow(); 五、異常處理中需要注意的問題 1. 如果拋出的異常一直沒有函數(shù)捕獲(catch),則會一直上傳到c++運(yùn)行系統(tǒng)那里,導(dǎo)致整個(gè)程序的終止 2. 一般在異常拋出后資源可以正常被釋放,但注意如果在類的構(gòu)造函數(shù)中拋出異常,系統(tǒng)是不會調(diào)用它的析構(gòu)函數(shù)的,處理方法是:如果在構(gòu)造函數(shù)中要拋出異常,則在拋出前要記得刪除申請的資源。 3. 異常處理僅僅通過類型而不是通過值來匹配的,所以catch塊的參數(shù)可以沒有參數(shù)名稱,只需要參數(shù)類型。 4. 函數(shù)原型中的異常說明要與實(shí)現(xiàn)中的異常說明一致,否則容易引起異常沖突。 5. 應(yīng)該在throw語句后寫上異常對象時(shí),throw先通過Copy構(gòu)造函數(shù)構(gòu)造一個(gè)新對象,再把該新對象傳遞給 catch. 那么當(dāng)異常拋出后新對象如何釋放? 異常處理機(jī)制保證:異常拋出的新對象并非創(chuàng)建在函數(shù)棧上,而是創(chuàng)建在專用的異常棧上,因此它才可以跨接多個(gè)函數(shù)而傳遞到上層,否則在棧清空的過程中就會被銷毀。所有從try到throw語句之間構(gòu)造起來的對象的析構(gòu)函數(shù)將被自動(dòng)調(diào)用。但如果一直上溯到main函數(shù)后還沒有找到匹配的catch塊,那么系統(tǒng)調(diào)用terminate()終止整個(gè)程序,這種情況下不能保證所有局部對象會被正確地銷毀。 6. catch塊的參數(shù)推薦采用地址傳遞而不是值傳遞,不僅可以提高效率,還可以利用對象的多態(tài)性。另外,派生類的異常撲獲要放到父類異常撲獲的前面,否則,派生類的異常無法被撲獲。 7. 編寫異常說明時(shí),要確保派生類成員函數(shù)的異常說明和基類成員函數(shù)的異常說明一致,即派生類改寫的虛函數(shù)的異常說明至少要和對應(yīng)的基類虛函數(shù)的異常說明相同,甚至更加嚴(yán)格,更特殊。
2010年9月計(jì)算機(jī)等級考試成績查詢時(shí)間匯總
2011年計(jì)算機(jī)等級考試二級C++輔導(dǎo)筆記匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |