




已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章異常處理,清華大學(xué)鄭莉,目錄,12.1異常處理的基本思想12.2C+異常處理的實(shí)現(xiàn)12.3異常處理中的構(gòu)造與析構(gòu)12.4標(biāo)準(zhǔn)程序庫異常處理12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn)12.6深度探索12.7小結(jié),2,12.1異常處理的基本思想,3,12.2.1異常處理的語法,4,12.2C+異常處理的實(shí)現(xiàn),拋擲異常的程序段.throw表達(dá)式;.,捕獲并處理異常的程序段try復(fù)合語句catch(異常聲明)復(fù)合語句catch(異常聲明)復(fù)合語句,保護(hù)段,異常處理程序,12.2.1異常處理的語法(續(xù)),若有異常則通過throw操作創(chuàng)建一個(gè)異常對(duì)象并拋擲。將可能拋出異常的程序段嵌在try塊之中??刂仆ㄟ^正常的順序執(zhí)行到達(dá)try語句,然后執(zhí)行try塊內(nèi)的保護(hù)段。如果在保護(hù)段執(zhí)行期間沒有引起異常,那么跟在try塊后的catch子句就不執(zhí)行。程序從try塊后跟隨的最后一個(gè)catch子句后面的語句繼續(xù)執(zhí)行下去。catch子句按其在try塊后出現(xiàn)的順序被檢查。匹配的catch子句將捕獲并處理異常(或繼續(xù)拋擲異常)。如果匹配的處理器未找到,則運(yùn)行庫函數(shù)terminate將被自動(dòng)調(diào)用,其缺省功能是調(diào)用abort終止程序。,5,12.2C+異常處理的實(shí)現(xiàn),例12-1處理除零異常,/12_1.cpp#includeusingnamespacestd;intdivide(intx,inty)if(y=0)throwx;returnx/y;intmain()trycout5/2=divide(5,2)endl;cout8/0=divide(8,0)endl;cout7/1=divide(7,1)endl;catch(inte)couteisdividedbyzero!endl;coutThatisok.endl;return0;,6,12.2C+異常處理的實(shí)現(xiàn)12.2.1異常處理的語法,結(jié)果如下:5/2=28isdividedbyzero!Thatisok.,12.2.2異常接口聲明,可以在函數(shù)的聲明中列出這個(gè)函數(shù)可能拋擲的所有異常類型。例如:voidfun()throw(A,B,C,D);若無異常接口聲明,則此函數(shù)可以拋擲任何類型的異常。不拋擲任何類型異常的函數(shù)聲明如下:voidfun()throw();,7,12.2C+異常處理的實(shí)現(xiàn),12.3異常處理中的構(gòu)造與析構(gòu),找到一個(gè)匹配的catch異常處理后初始化異常參數(shù)。將從對(duì)應(yīng)的try塊開始到異常被拋擲處之間構(gòu)造(且尚未析構(gòu))的所有自動(dòng)對(duì)象進(jìn)行析構(gòu)。從最后一個(gè)catch處理之后開始恢復(fù)執(zhí)行。,8,例12-2使用帶析構(gòu)語義的類的C+異常處理,/12_2.cpp#include#includeusingnamespacestd;classMyExceptionpublic:MyException(conststring,9,12.3異常處理中的構(gòu)造與析構(gòu),voidfunc()throw(MyException)Demod;coutThrowMyExceptioninfunc()endl;throwMyException(exceptionthrownbyfunc();intmain()coutInmainfunctionendl;tryfunc();catch(MyException,10,例12-2(續(xù)),12.3異常處理中的構(gòu)造與析構(gòu),例12-2(續(xù)),結(jié)果如下:InmainfunctionConstructorofDemoThrowMyExceptioninfunc()DestructorofDemoCaughtanexception:exceptionthrownbyfunc()Resumetheexecutionofmain(),11,12.3異常處理中的構(gòu)造與析構(gòu),12.4標(biāo)準(zhǔn)程序庫異常處理,12,標(biāo)準(zhǔn)程序庫的異常類,exception:標(biāo)準(zhǔn)程序庫異常類的公共基類logic_error表示可以在程序中被預(yù)先檢測(cè)到的異常如果小心地編寫程序,這類異常能夠避免runtime_error表示難以被預(yù)先檢測(cè)的異常,13,12.4標(biāo)準(zhǔn)程序庫異常處理,例12-3三角形面積計(jì)算,編寫一個(gè)計(jì)算三角形面積的函數(shù),函數(shù)的參數(shù)為三角形三邊邊長(zhǎng)a、b、c,可以用Heron公式計(jì)算:設(shè),則三角形面積,14,12.4標(biāo)準(zhǔn)程序庫異常處理,例12-3(續(xù)),/12_3.cpp#include#include#includeusingnamespacestd;/給出三角形三邊長(zhǎng),計(jì)算三角形面積doublearea(doublea,doubleb,doublec)throw(invalid_argument)/判斷三角形邊長(zhǎng)是否為正if(a=0|b=0|c=0)throwinvalid_argument(thesidelengthshouldbepositive);/判斷三邊長(zhǎng)是否滿足三角不等式if(a+b=c|b+cbc;trydoubles=area(a,b,c);/嘗試計(jì)算三角形面積coutArea:sendl;catch(exception,16,12.4標(biāo)準(zhǔn)程序庫異常處理,例12-3(續(xù)),運(yùn)行結(jié)果1:Pleaseinputthesidelengthsofatriangle:345Area:6運(yùn)行結(jié)果2:Pleaseinputthesidelengthsofatriangle:055Error:thesidelengthshouldbepositive運(yùn)行結(jié)果2:Pleaseinputthesidelengthsofatriangle:124Error:thesidelengthshouldfitthetriangleinequation,17,12.4標(biāo)準(zhǔn)程序庫異常處理,12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn),本例中,在構(gòu)造或輸入一個(gè)Date對(duì)象時(shí)如發(fā)生了錯(cuò)誤,直接使用標(biāo)準(zhǔn)程序庫中的runtime_error構(gòu)造異常并拋出;在賬戶類中如發(fā)生了錯(cuò)誤,由于希望異常信息能夠標(biāo)識(shí)是哪個(gè)賬戶發(fā)生了錯(cuò)誤。本程序中創(chuàng)建了一個(gè)類AccountException,該類從runtime_error派生,該類中保存了一個(gè)Account型常指針,指向發(fā)生錯(cuò)誤的賬戶,這樣在主函數(shù)中,輸出錯(cuò)誤信息的同時(shí)也可以將賬號(hào)輸出。,18,/date.cpp,僅列出與以前不同的內(nèi)容,下同#includedate.h#include#includeusingnamespacestd;Date:Date(intyear,intmonth,intday):year(year),month(month),day(day)if(daygetMaxDay()throwruntime_error(Invaliddate);intyears=year-1;totalDays=years*365+years/4-years/100+years/400+DAYS_BEFORE_MONTHmonth-1+day;if(isLeapYear(),19,12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn),例12-4,/account.h#ifndef_ACCOUNT_H_#define_ACCOUNT_H_#includedate.h#includeaccumulator.h#include#include#include#include/account.h中增加了以下類,其它各類的定義與例11-13完全相同,不再重復(fù)給出classAccountException:publicstd:runtime_errorprivate:constAccount*account;public:AccountException(constAccount*account,conststd:string#endif/_ACCOUNT_H_,20,12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn),例12-4(續(xù)),/account.cpp中僅以下成員函數(shù)的實(shí)現(xiàn)與例11-13不同,其它內(nèi)容皆與之完全相同voidAccount:error(conststring/關(guān)閉文件,21,12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn),例12-4(續(xù)),ofstreamfileOut(FILE_NAME,ios_base:app);/以追加模式cout;stringcmdLine;getline(cin,cmdLine);tryif(controller.runCommand(cmdLine)fileOutgetId():e.what()w21500buyatelevision2009-1-1#C5392394-1500-1550buyatelevision2009-1-1Total:18982.9commandq2008-12-52009-1-32Error:Invaliddate2009-1-1Total:18982.9commandq2008-12-52009-1-312008-12-5#S3755217550010500salary2009-1-1#S375521717.7710517.8interest2009-1-1#0234234215.1610015.2interest2009-1-1#C5392394-50-50annualfee2009-1-1#C5392394-1500-1550buyatelevision2009-1-1Total:18982.9commande,23,12.5綜合實(shí)例對(duì)個(gè)人銀行賬戶管理程序的改進(jìn),12.6.1異常安全性問題,一個(gè)異常安全的函數(shù),在有異常拋出時(shí):不應(yīng)泄露任何資源不能使任何對(duì)象進(jìn)入非法狀態(tài)反例:例9-8中的下列代碼:templatevoidStack:push(constT/將新元素壓入棧頂如果賦值過程中有異常拋出,由于top已經(jīng)增1,棧頂?shù)膬?nèi)容將變得不確定。,24,12.6深度探索,12.6.1異常安全性問題(續(xù)),該函數(shù)的修正版本:templatevoidStack:push(constT即使賦值時(shí)拋出異常,由于此時(shí)top并沒有真正增1,因此當(dāng)前對(duì)象的狀態(tài)沒有改變,該函數(shù)是異常安全的。,25,12.6深度探索,編寫異常安全程序的原則,明確哪些操作絕對(duì)不會(huì)拋擲異常這些操作是異常安全編程的基石例:基本數(shù)據(jù)類型的絕大部分操作,針的賦值、算術(shù)運(yùn)算和比較運(yùn)算,STL容器的swap函數(shù)盡量確保析構(gòu)函數(shù)不拋擲異常,26,12.6深度探索12.6.1異常安全性問題,12.6.2避免異常發(fā)生時(shí)的資源泄漏,一個(gè)函數(shù),必須在有異常向外拋出前,釋放應(yīng)由它負(fù)責(zé)釋放的資源。通常的解決方案把一切動(dòng)態(tài)分配的資源都包裝成棧上的對(duì)象,利用拋擲異常時(shí)自動(dòng)調(diào)用對(duì)象析構(gòu)函數(shù)的特性來釋放資源。對(duì)于必須在堆上構(gòu)造的對(duì)象,可以用智能指針auto_ptr加以包裝。,27,12.6深度探索,智能指針auto_ptr,C+標(biāo)準(zhǔn)庫的一個(gè)類模板在memory頭文件中定義有一個(gè)類型參數(shù)X,表示智能指針指向數(shù)據(jù)的類型每個(gè)智能指針對(duì)象關(guān)聯(lián)一個(gè)普通指針構(gòu)造函數(shù):explicitauto_ptr(X*p=0)throw();獲得與智能指針對(duì)象關(guān)聯(lián)的指針:X*get()constthrow();由于auto_ptr的“*”與“-”運(yùn)算符已被重載,對(duì)一個(gè)auto_ptr的對(duì)象使用“*”和“-”,等價(jià)于對(duì)它所關(guān)聯(lián)的指針使用相應(yīng)運(yùn)算符。,28,12
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZSA 278-2024 軌道交通.用銑磨機(jī)器人
- 2025年度高新技術(shù)企業(yè)員工離職競(jìng)業(yè)限制補(bǔ)償金合同
- 二零二五年度教育行業(yè)人才招聘定金協(xié)議
- 二零二五年度金融機(jī)構(gòu)間反洗錢合作協(xié)議
- 2025年度金融項(xiàng)目評(píng)審合同風(fēng)險(xiǎn)控制
- 二零二五商場(chǎng)合同管理操作手冊(cè)附小時(shí)計(jì)費(fèi)服務(wù)條款
- 2025年度環(huán)保產(chǎn)業(yè)合作開發(fā)合伙協(xié)議書
- 二零二五年度供用熱力合同糾紛司法解釋及執(zhí)行難點(diǎn)解析
- 二零二五年度超市促銷活動(dòng)商品陳列策劃合同
- 2025沈陽公司總經(jīng)理聘用合同全面規(guī)范管理細(xì)則
- 【正版授權(quán)】 IEC 63310:2025 EN Functional performance criteria for AAL robots used in connected home environment
- 最終版附件1:“跨學(xué)科主題學(xué)習(xí)”教學(xué)設(shè)計(jì)(2025年版)
- 報(bào)價(jià)單報(bào)價(jià)表
- DBJ 15-82-2011 蒸壓加氣混凝土砌塊自承重墻體技術(shù)規(guī)程
- 《民航旅客運(yùn)輸》項(xiàng)目二課件
- 應(yīng)聘人員面試登記表
- 兩擋AMT換擋執(zhí)行機(jī)構(gòu)設(shè)計(jì)及仿真
- (精心整理)事故后果模擬分析
- MBR系統(tǒng)運(yùn)行技術(shù)手冊(cè)
- 中國河流湖泊
- 學(xué)校中層干部民主測(cè)評(píng)表(一)
評(píng)論
0/150
提交評(píng)論