版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第十二章 異常處理清華大學 鄭 莉C+語言程序設計2本章主要內(nèi)容異常處理的基本思想C+異常處理的實現(xiàn)異常處理中的構(gòu)造與析構(gòu)標準程序庫異常處理小結(jié)3異常處理的基本思想函數(shù)f()捕獲并處理異常函數(shù)h() 引發(fā)異常函數(shù)g()調(diào)用者異常傳播方向調(diào)用關(guān)系異常處理的基本思想4異常處理的執(zhí)行過程拋擲異常的程序段.throw 表達式;.捕獲并處理異常的程序段try 復合語句catch(異常聲明) 復合語句catch(異常聲明) 復合語句 保護段異常處理程序C+異常處理的實現(xiàn)5異常處理的執(zhí)行過程(續(xù))若有異常則通過throw操作創(chuàng)建一個異常對象并拋擲。將可能拋出異常的程序段嵌在try塊之中??刂仆ㄟ^正常的順序執(zhí)
2、行到達try語句,然后執(zhí)行try塊內(nèi)的保護段。如果在保護段執(zhí)行期間沒有引起異常,那么跟在try塊后的catch子句就不執(zhí)行。程序從try塊后跟隨的最后一個catch子句后面的語句繼續(xù)執(zhí)行下去。catch子句按其在try塊后出現(xiàn)的順序被檢查。匹配的catch子句將捕獲并處理異常(或繼續(xù)拋擲異常)。如果匹配的處理器未找到,則運行庫函數(shù)terminate將被自動調(diào)用,其缺省功能是調(diào)用abort終止程序。C+異常處理的實現(xiàn)6例12-1處理除零異常#include using namespace std;int divide(int x, int y) if (y = 0)throw x;return
3、x / y;int main() try cout 5 / 2 = divide(5, 2) endl;cout 8 / 0 = divide(8, 0) endl;cout 7 / 1 = divide(7, 1) endl; catch (int e) cout e is divided by zero! endl;cout That is ok. endl;return 0;程序運行結(jié)果如下:5 / 2 = 28 is divided by zero!That is ok.C+異常處理的實現(xiàn)7異常接口聲明可以在函數(shù)的聲明中列出這個函數(shù)可能拋擲的所有異常類型。例如:void fun() t
4、hrow(A,B,C,D);若無異常接口聲明,則此函數(shù)可以拋擲任何類型的異常。不拋擲任何類型異常的函數(shù)聲明如下:void fun() throw();C+異常處理的實現(xiàn)8異常處理中的構(gòu)造與析構(gòu)找到一個匹配的catch異常處理后初始化異常參數(shù)。將從對應的try塊開始到異常被拋擲處之間構(gòu)造(且尚未析構(gòu))的所有自動對象進行析構(gòu)。從最后一個catch處理之后開始恢復執(zhí)行。異常處理的構(gòu)造與析構(gòu)9例12-2 異常處理時的析構(gòu)#include #include using namespace std;class MyException public:MyException(const string &mes
5、sage) : message(message) MyException() const string &getMessage() const return message; private:string message;異常處理的構(gòu)造與析構(gòu)class Demo public:Demo() cout Constructor of Demo endl; Demo() cout Destructor of Demo endl; ;void func() throw (MyException) Demo d;cout Throw MyException in func() endl;throw My
6、Exception(exception thrown by func();10int main() cout In main function endl;try func(); catch (MyException& e) cout Caught an exception: e.getMessage() endl; cout Resume the execution of main() endl;return 0;11程序運行時輸出:In main functionConstructor of DemoThrow MyException in func()Destructor of DemoC
7、aught an exception: exception thrown by func()Resume the execution of main()12標準程序庫異常處理13標準程序庫異常處理標準程序庫的異常類exception:標準程序庫異常類的公共基類logic_error表示可以在程序中被預先檢測到的異常如果小心地編寫程序,這類異常能夠避免runtime_error表示難以被預先檢測的異常14標準程序庫異常處理例12-3:計算三角形面積編寫一個計算三角形面積的函數(shù),函數(shù)的參數(shù)為三角形三邊邊長a、b、c,三角形面積用Heron公式計算。在計算三角形面積的函數(shù)中需要判斷輸入的參數(shù)a、b、
8、c是否構(gòu)成一個三角形,若三個邊長不能構(gòu)成三角形,則需要拋出異常。15標準程序庫異常處理#include #include #include using namespace std;double area(double a, double b, double c) throw (invalid_argument) /判斷三角形邊長是否為正if (a = 0 | b = 0 | c = 0)throw invalid_argument(the side length should be positive);/判斷三邊長是否滿足三角不等式if (a + b = c | b + c = a | c +
9、 a = b)throw invalid_argument(the side length should fit the triangle inequation);/由Heron公式計算三角形面積double s = (a + b + c) / 2;return sqrt(s * (s - a) * (s - b) * (s - c);16int main() double a, b, c;/三角形三邊長cout a b c;try double s = area(a, b, c);/嘗試計算三角形面積cout Area: s endl; catch (exception &e) cout E
10、rror: e.what() endl;return 0;17程序運行時輸出1:Please input the side lengths of a triangle: 3 4 5Area: 6程序運行時輸出2:Please input the side lengths of a triangle: 0 5 5Error: the side length should be positive程序運行時輸出3:Please input the side lengths of a triangle: 1 2 4Error: the side length should fit the triang
11、le inequation18什么是異常安全(1)一個異常安全的函數(shù),在有異常拋出時:不應泄露任何資源不能使任何對象進入非法狀態(tài)反例:例9-8中的下列代碼:template void Stack:push(const T &item) assert(!isFull();/如果棧滿了,則報錯list+top = item;/將新元素壓入棧頂如果賦值過程中有異常拋出,由于top已經(jīng)增1,棧頂?shù)膬?nèi)容將變得不確定。19什么是異常安全(2)該函數(shù)的修正版本:template void Stack:push(const T &item) assert(!isFull();/如果棧滿了,則報錯listtop
12、 + 1 = item;/將新元素壓入棧頂top+;即使賦值時拋出異常,由于此時top并沒有真正增1,因此當前對象的狀態(tài)沒有改變,該函數(shù)是異常安全的。20編寫異常安全程序的原則明確哪些操作絕對不會拋擲異常這些操作是異常安全編程的基石例:基本數(shù)據(jù)類型的絕大部分操作,針的賦值、算術(shù)運算和比較運算,STL容器的swap函數(shù)盡量確保析構(gòu)函數(shù)不拋擲異常21避免異常發(fā)生時的資源泄漏一個函數(shù),必須在有異常向外拋出前,釋放應由它負責釋放的資源。通常的解決方案把一切動態(tài)分配的資源都包裝成棧上的對象,利用拋擲異常時自動調(diào)用對象析構(gòu)函數(shù)的特性來釋放資源。對于必須在堆上構(gòu)造的對象,可以用智能指針auto_ptr加以包裝。22智能指針auto_ptr(1)C+標準庫的一個類模板在memory頭文件中定義有一個類型參數(shù)X,表示智能指針指向數(shù)據(jù)的類型每個智能指針對象關(guān)聯(lián)一個普通指針構(gòu)造函數(shù):explicit auto_ptr(X *p = 0) throw();獲得與智能指針對象關(guān)聯(lián)的指針:X *get() const throw();由于auto_ptr的“*”與“-”運算符已被重載,對一個auto_ptr的對象使用“*”和“-”,等價于對它所關(guān)聯(lián)的指針使用相應運算符。23智能指針
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 福建海島桃金娘群落特征、葉功能性狀及其環(huán)境影響因子研究
- 網(wǎng)絡雙絞線專項施工方案
- 2025年安徽財貿(mào)職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 張力圍欄施工方案
- 2025至2030年中國墨囊數(shù)據(jù)監(jiān)測研究報告
- 2025年天府新區(qū)信息職業(yè)學院高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年大理護理職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025至2030年中國分切衛(wèi)生盤紙數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國中國名人郵票大全珍藏冊數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國DMC硬壓墊塊數(shù)據(jù)監(jiān)測研究報告
- 2024-2030年中國招標代理行業(yè)深度分析及發(fā)展前景與發(fā)展戰(zhàn)略研究報告
- 醫(yī)師定期考核 (公共衛(wèi)生)試題庫500題(含答案)
- 基因突變和基因重組(第1課時)高一下學期生物人教版(2019)必修2
- 內(nèi)科學(醫(yī)學高級):風濕性疾病試題及答案(強化練習)
- 音樂劇好看智慧樹知到期末考試答案2024年
- 辦公設備(電腦、一體機、投影機等)采購 投標方案(技術(shù)方案)
- 案卷評查培訓課件模板
- 2024年江蘇省樣卷五年級數(shù)學上冊期末試卷及答案
- 人教版初中英語七八九全部單詞(打印版)
- 波浪理論要點圖解完美版
- 金融交易數(shù)據(jù)分析與風險評估項目環(huán)境敏感性分析
評論
0/150
提交評論