

下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 6/6c+異常處理機制示例及講解 c+異常處理機制示例及講解(含源代碼) 這兩天我寫了一個測試c+異常處理機制的例子,感覺有很好的示范作用,在此貼出來,給c+異常處理的初學者入門。本文后附有c+異常的知識普及,有興趣者也可以看看。 下面的代碼直接貼到你的console工程中,可以運行調(diào)試看看效果,并分析c+的異常機制。 #include stdafx.h #include #include #include / 內(nèi)存泄露檢測機制 #define _CRTDBG_MAP_ALLOC #ifdef _DEBUG #define new new(_NORMAL_BLOCK, _FILE_, _LI
2、NE_) #endif / 自定義異常類 class MyExcepction public: / 構(gòu)造函數(shù),參數(shù)為錯誤代碼 MyExcepction(int errorId) / 輸出構(gòu)造函數(shù)被調(diào)用信息 std:cout m_errorId = myExp.m_errorId; MyExcepction() / 輸出析構(gòu)函數(shù)被調(diào)用信息 std:cout throwErrorCode; try if ( throwErrorCode = 110) MyExcepction myStru(110); / 拋出對象的地址 - 由catch( MyExcepction* pMyExcepction)
3、 捕獲 / 這里該對象的地址拋出給catch語句,不會調(diào)用對象的拷貝構(gòu)造函數(shù) / 傳地址是提倡的做法,不會頻繁地調(diào)用該對象的構(gòu)造函數(shù)或拷貝構(gòu)造函數(shù) / catch語句執(zhí)行結(jié)束后,myStru會被析構(gòu)掉 throw else if ( throwErrorCode = 119 ) MyExcepction myStru(119); / 拋出對象,這里會通過拷貝構(gòu)造函數(shù)創(chuàng)建一個臨時的對象傳出給catch / 由catch( MyExcepction myExcepction) 捕獲 / 在catch語句中會再次調(diào)用通過拷貝構(gòu)造函數(shù)創(chuàng)建臨時對象復(fù)制這里傳過去的對象/ throw結(jié)束后myStru會被
4、析構(gòu)掉 throw myStru; else if ( throwErrorCode = 120 ) / 不提倡這樣的拋出方法 / 這樣做的話,如果catch( MyExcepction* pMyExcepction)中不執(zhí)行delete操作則會發(fā)生內(nèi)存泄露 / 由catch( MyExcepction* pMyExcepction) 捕獲 MyExcepction * pMyStru = new MyExcepction(120); throw pMyStru; else / 直接創(chuàng)建新對象拋出 / 相當于創(chuàng)建了臨時的對象傳遞給了catch語句 / 由catch接收時通過拷貝構(gòu)造函數(shù)再次創(chuàng)建
5、臨時對象接收傳遞過去的對象 / throw結(jié)束后兩次創(chuàng)建的臨時對象會被析構(gòu)掉 throw MyExcepction(throwErrorCode); catch( MyExcepction* pMyExcepction) / 輸出本語句被執(zhí)行信息 std:cout getErrorId() temp; return 0; 知識點: c+異常機制 一、概述 C+自身有著非常強的糾錯能力,發(fā)展到如今,已經(jīng)建立了比較完善的異常處理機制。C+的異常情況無非兩種,一種是語法錯誤,即程序中出現(xiàn)了錯誤的語句,函數(shù),結(jié)構(gòu)和類,致使編譯程序無法進行。另一種是運行時發(fā)生的錯誤,一般與算法有關(guān)。 關(guān)于語法錯誤,不必
6、多說,寫代碼時心細一點就可以解決。C+編譯器的報錯機制可以讓我們輕松地解決這些錯誤。 第二種是運行時的錯誤,常見的有文件打開失敗、數(shù)組下標溢出、系統(tǒng)內(nèi)存不足等等。而一旦出現(xiàn)這些問題,引發(fā)算法失效、程序運行時無故停止等故障也是常有的。這就要求我們在設(shè)計軟件算法時要全面。比如針對文件打開失敗的情況,保護的方法有很多種,最簡單的就是使用“return”命令,告訴上層調(diào)用者函數(shù)執(zhí)行失??;另外一種處理策略就是利用 c+的異常機制,拋出異常。 二、c+異常處理機制 C+異常處理機制是一個用來有效地處理運行錯誤的非常強大且靈活的工具,它提供了更多的彈性、安全性和穩(wěn)固性,克服了傳統(tǒng)方法所帶來的問題. 異常的拋
7、出和處理主要使用了以下三個關(guān)鍵字: try、 throw 、 catch 。 拋出異常即檢測是否產(chǎn)生異常,在C+中,其采用throw語句來實現(xiàn),如果檢測到產(chǎn)生異常,則拋出異常。該語句的格式為: throw 表達式; 如果在try語句塊的程序段中(包括在其中調(diào)用的函數(shù))發(fā)現(xiàn)了異常,且拋棄了該異常,則這個異常就可以被try語句塊后的某個catch語句所捕獲并處理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由于C+使用數(shù)據(jù)類型來區(qū)分不同的異常,因此在判斷異常時,throw語句中的表達式的值就沒有實際意義,而表達式的類型就特別重要。 try-catch語句形式如下: try
8、 包含可能拋出異常的語句; catch(類型名 形參名) / 捕獲特定類型的異常 catch(類型名 形參名) / 捕獲特定類型的異常 catch(.) / 三個點則表示捕獲所有類型的異常 【范例1】處理除數(shù)為0的異常。該范例將上述除數(shù)為0的異??梢杂胻ry/catch語句來捕獲異常,并使用throw語句來拋出異常,從而實現(xiàn)異常處理,實現(xiàn)代碼如代碼清單1-1所示。 / 代碼清單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、9 return x/y; /否則返回兩個數(shù)的商 10 11 void main() 12 13 double res; 14 try /定義異常 15 16 res=fuc(2,3); 17 coutThe result of x/y is : resendl; 18 res=fuc(4,0); /出現(xiàn)異常,函數(shù)內(nèi)部會拋出異常 19 20 catch(double) /捕獲并處理異常 21 22 cerrerror of dividing zero.n; 23 exit(1); /異常退出程序 24 25 【范例2】自定義異常類型(在本文開始的代碼中已經(jīng)給出示范) 三、異常的接口聲明 為了加
10、強程序的可讀性,使函數(shù)的用戶能夠方便地知道所使用的函數(shù)會拋出哪些異常,可以在函數(shù)的聲明中列出這個函數(shù)可能拋出的所有異常類型,例如: void fun() throw( A,B,C,D);這表明函數(shù)fun()可能并且只可能拋出類型(A,B,C,D)及其子類型的異常。 如果在函數(shù)的聲明中沒有包括異常的接口聲明,則此函數(shù)可以拋出任何類型的異常,例如:void fun(); 一個不會拋出任何類型異常的函數(shù)可以進行如下形式的聲明: void fun() thow(); 五、異常處理中需要注意的問題 1. 如果拋出的異常一直沒有函數(shù)捕獲(catch),則會一直上傳到c+運行系統(tǒng)那里,導(dǎo)致整個程序的終止 2
11、. 一般在異常拋出后資源可以正常被釋放,但注意如果在類的構(gòu)造函數(shù)中拋出異常,系統(tǒng)是不會調(diào)用它的析構(gòu)函數(shù)的,處理方法是:如果在構(gòu)造函數(shù)中要拋出異常,則在拋出前要記得刪除申請的資源。 3. 異常處理僅僅通過類型而不是通過值來匹配的,所以catch塊的參數(shù)可以沒有參數(shù)名稱,只需要參數(shù)類型。 4. 函數(shù)原型中的異常說明要與實現(xiàn)中的異常說明一致,否則容易引起異常沖突。 5. 應(yīng)該在throw語句后寫上異常對象時,throw先通過Copy構(gòu)造函數(shù)構(gòu)造一個新對象,再把該新對象傳遞給 catch. 那么當異常拋出后新對象如何釋放? 異常處理機制保證:異常拋出的新對象并非創(chuàng)建在函數(shù)棧上,而是創(chuàng)建在專用的異常棧上
12、,因此它才可以跨接多個函數(shù)而傳遞到上層,否則在棧清空的過程中就會被銷毀。所有從try到throw語句之間構(gòu)造起來的對象的析構(gòu)函數(shù)將被自動調(diào)用。但如果一直上溯到main 函數(shù)后還沒有找到匹配的catch塊,那么系統(tǒng)調(diào)用terminate()終止整個程序,這種情況下不能保證所有局部對象會被正確地銷毀。 6. catch塊的參數(shù)推薦采用地址傳遞而不是值傳遞,不僅可以提高效率,還可以利用對象的多態(tài)性。另外,派生類的異常撲獲要放到父類異常撲獲的前面,否則,派生類的異常無法被撲獲。 7. 編寫異常說明時,要確保派生類成員函數(shù)的異常說明和基類成員函數(shù)的異常說明一致,即派生類改寫的虛函數(shù)的異常說明至少要和對應(yīng)
13、的基類虛函數(shù)的異常說明相同,甚至更加嚴格,更特殊。 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
14、啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
15、啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
16、啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
17、啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
18、啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年半導(dǎo)體用石英玻璃材料項目發(fā)展計劃
- 綠色新能源發(fā)電技術(shù)研發(fā)投資合同
- 機房服務(wù)外包服務(wù)合同
- Picrinine-Standard-生命科學試劑-MCE
- Isoflavone-Standard-生命科學試劑-MCE
- 幼兒繪本綠野仙蹤教案設(shè)計
- 貸款反擔保協(xié)合同書
- 2025年鋁鍛壓材項目建議書
- 2025年起動腳蹬桿項目合作計劃書
- 股權(quán)有償轉(zhuǎn)讓協(xié)議
- 2024年廣東高考(新課標I卷)語文試題及參考答案
- XX衛(wèi)生院關(guān)于落實國家組織藥品集中采購使用檢測和應(yīng)急預(yù)案及培訓(xùn)記錄
- 人教版八年級地理下冊教材分析
- Part3-4 Unit4 Volunteer Work課件-【中職專用】高一英語精研課堂(高教版2021·基礎(chǔ)模塊2)
- 法律援助課件
- 粒籽源永久性植入治療放射防護要求
- 雙減政策之下老師如何打造高效課堂
- 新員工入職健康體檢表
- 養(yǎng)老院行業(yè)現(xiàn)狀分析-2023年中國養(yǎng)老院行業(yè)市場發(fā)展前景研究報告-智研咨詢
- 廣東省特種作業(yè)操作證核發(fā)申請表
- 胸腔穿刺知情同意書
評論
0/150
提交評論