




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)第7章 異常處理t7.1 7.1 異常處理的基本思想異常處理的基本思想t7.2 C+7.2 C+異常處理的實(shí)現(xiàn)異常處理的實(shí)現(xiàn)t7.3 7.3 異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu)2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)7.1 異常處理的基本思想t計(jì)算機(jī)程序在機(jī)器上運(yùn)行時會產(chǎn)生錯誤,這計(jì)算機(jī)程序在機(jī)器上運(yùn)行時會產(chǎn)生錯誤,這些錯誤對于編程人員可以預(yù)料到但卻無法避些錯誤對于編程人員可以預(yù)料到但卻無法避免。免。t在一個小型程序中,一旦程序運(yùn)行時發(fā)生了在一個小型程序中,一旦程序運(yùn)行時發(fā)生了異常,一般是將程序立即中斷運(yùn)行,從而無異常,一般是將程序立即中斷運(yùn)行,從
2、而無條件釋放所有資源。而在一個較為復(fù)雜的軟條件釋放所有資源。而在一個較為復(fù)雜的軟件中,函數(shù)與函數(shù)之間存在著各自明確的功件中,函數(shù)與函數(shù)之間存在著各自明確的功能和相互間復(fù)雜的調(diào)用關(guān)系,發(fā)現(xiàn)錯誤的函能和相互間復(fù)雜的調(diào)用關(guān)系,發(fā)現(xiàn)錯誤的函數(shù)又并不具備處理錯誤的能力。數(shù)又并不具備處理錯誤的能力。 2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)tC+C+的異常處理機(jī)制使得異常的引發(fā)和的異常處理機(jī)制使得異常的引發(fā)和處理不需要在同一函數(shù)內(nèi)完成,它可以處理不需要在同一函數(shù)內(nèi)完成,它可以將異常向上傳播,這樣底層的函數(shù)可以將異常向上傳播,這樣底層的函數(shù)可以專門用以解決具體問題,而上層的調(diào)用專門用以解決具體問題,而上層的調(diào)
3、用者就可以在適當(dāng)?shù)奈恢冕槍Σ煌愋偷恼呔涂梢栽谶m當(dāng)?shù)奈恢冕槍Σ煌愋偷漠惓TO(shè)計(jì)處理。異常設(shè)計(jì)處理。 7.1 異常處理的基本思想2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)7.2 C+異常處理的實(shí)現(xiàn)t7.2.1 7.2.1 異常處理的機(jī)制異常處理的機(jī)制t7.2.2 7.2.2 異常處理的規(guī)則異常處理的規(guī)則2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)7.2.1 異常處理的機(jī)制tC+C+語言提供了對處理異常情況的內(nèi)部語言提供了對處理異常情況的內(nèi)部支持。在支持。在C+C+語言中,語言中,trytry、throwthrow和和catchcatch語句就是用于實(shí)現(xiàn)異常處理的機(jī)語句就是用于實(shí)現(xiàn)異常處理的機(jī)制。有了制。有
4、了C+C+程序的異常處理機(jī)制,程程序的異常處理機(jī)制,程序可以向更高的執(zhí)行上下文傳遞意想不序可以向更高的執(zhí)行上下文傳遞意想不到的事件,使到的事件,使C+C+程序能更好地從各種程序能更好地從各種異常事件中進(jìn)行有效地恢復(fù),從而更好異常事件中進(jìn)行有效地恢復(fù),從而更好地執(zhí)行地執(zhí)行 2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)t異常處理的機(jī)制的主體有兩大部分,一異常處理的機(jī)制的主體有兩大部分,一是錯誤偵測區(qū)塊,二是錯誤處理區(qū)塊。是錯誤偵測區(qū)塊,二是錯誤處理區(qū)塊。 7.2.1 異常處理的機(jī)制2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)try /錯誤偵測區(qū)塊錯誤偵測區(qū)塊 復(fù)合語句復(fù)合語句 throw 異常類型表達(dá)式異常類
5、型表達(dá)式; /如果發(fā)生錯誤用如果發(fā)生錯誤用throw語句拋出異常語句拋出異常catch(異常類型(異常類型1) /錯誤處理區(qū)塊錯誤處理區(qū)塊 復(fù)合語句復(fù)合語句catch(異常類型(異常類型2) /錯誤處理區(qū)塊錯誤處理區(qū)塊 復(fù)合語句復(fù)合語句 catch() / 如果在前面并沒有列舉異常類型,則由此處理區(qū)塊處理如果在前面并沒有列舉異常類型,則由此處理區(qū)塊處理 /錯誤處理區(qū)塊錯誤處理區(qū)塊 復(fù)合語句復(fù)合語句 /try-throw-catch后繼續(xù)執(zhí)行后繼續(xù)執(zhí)行7.2.1 異常處理的機(jī)制2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)ttrytry子句后的復(fù)合語句是代碼的保護(hù)段。子句后的復(fù)合語句是代碼的保護(hù)段。ca
6、tchcatch子句后的復(fù)合語句是用來處理異常的程子句后的復(fù)合語句是用來處理異常的程序,處理由序,處理由throwthrow表達(dá)式拋擲的異常。表達(dá)式拋擲的異常。t當(dāng)錯誤偵測區(qū)塊里的程序執(zhí)行發(fā)生錯誤時,當(dāng)錯誤偵測區(qū)塊里的程序執(zhí)行發(fā)生錯誤時,將會利用將會利用throwthrow語句將異常類型拋出錯誤偵測語句將異常類型拋出錯誤偵測區(qū)塊,在對比區(qū)塊,在對比catchcatch語句中的異常類型后,尋語句中的異常類型后,尋找出并執(zhí)行處理該異常類型的程序區(qū)塊。當(dāng)找出并執(zhí)行處理該異常類型的程序區(qū)塊。當(dāng)該區(qū)塊執(zhí)行完畢后,將繼續(xù)執(zhí)行該區(qū)塊執(zhí)行完畢后,將繼續(xù)執(zhí)行catchcatch語句后語句后的程序。的程序。7.2
7、.1 異常處理的機(jī)制2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)t異常處理的執(zhí)行過程分成以下幾個步異常處理的執(zhí)行過程分成以下幾個步驟:驟:l控制通過正常的順序執(zhí)行到達(dá)控制通過正常的順序執(zhí)行到達(dá)trytry語句,語句,然后執(zhí)行然后執(zhí)行trytry塊內(nèi)的代碼保護(hù)段。塊內(nèi)的代碼保護(hù)段。 l如果在保護(hù)段執(zhí)行期間沒有引起異常,就如果在保護(hù)段執(zhí)行期間沒有引起異常,就不執(zhí)行跟在不執(zhí)行跟在trytry塊后的塊后的catchcatch子句,程序從子句,程序從異常被拋擲的異常被拋擲的trytry塊后跟隨的最后一個塊后跟隨的最后一個catchcatch子句后面的語句繼續(xù)執(zhí)行下去。子句后面的語句繼續(xù)執(zhí)行下去。 7.2.1
8、異常處理的機(jī)制2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)l如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任何函數(shù)中有異常被拋擲,則從通過何函數(shù)中有異常被拋擲,則從通過throwthrow操操作數(shù)創(chuàng)建的對象中創(chuàng)建一個異常對象。作數(shù)創(chuàng)建的對象中創(chuàng)建一個異常對象。 l如果匹配的處理器未找到,則運(yùn)行函數(shù)如果匹配的處理器未找到,則運(yùn)行函數(shù)terminateterminate將被自動調(diào)用,而函數(shù)將被自動調(diào)用,而函數(shù)terminateterminate的默認(rèn)功能是調(diào)用的默認(rèn)功能是調(diào)用abortabort終止程序。終止程序。l如果找到了一個匹配的如果找到了一個匹配的catchcatch
9、處理程序,且處理程序,且它通過值進(jìn)行捕獲,則其行參通過拷貝異常它通過值進(jìn)行捕獲,則其行參通過拷貝異常對象進(jìn)行初始化。對象進(jìn)行初始化。 7.2.1 異常處理的機(jī)制2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)7.2.2 異常處理的規(guī)則t編寫異常處理程序的規(guī)則是:編寫異常處理程序的規(guī)則是: l如果預(yù)料某段程序代碼(或?qū)δ硞€函數(shù)的如果預(yù)料某段程序代碼(或?qū)δ硞€函數(shù)的調(diào)用)有可能發(fā)生異常,就將它放在調(diào)用)有可能發(fā)生異常,就將它放在trytry子句之后。子句之后。l如果某段程序中出現(xiàn)了自己不能處理的異如果某段程序中出現(xiàn)了自己不能處理的異常,就可以使用常,就可以使用throwthrow語句來拋擲出這個語句來拋擲出
10、這個異常,將它拋擲給調(diào)用者。異常,將它拋擲給調(diào)用者。 2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)lcatchcatch子句后的復(fù)合語句用來處理由子句后的復(fù)合語句用來處理由throwthrow表達(dá)式拋擲的異常。表達(dá)式拋擲的異常。l當(dāng)異常被拋擲以后,當(dāng)異常被拋擲以后,catchcatch子句便依次被子句便依次被檢查,若某個檢查,若某個catchcatch子句的異常類型聲明子句的異常類型聲明與被拋擲的異常類型一致,則執(zhí)行該段異與被拋擲的異常類型一致,則執(zhí)行該段異常處理程序。常處理程序。7.2.2 異常處理的規(guī)則2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)t例:處理除零異常 #include using nam
11、espace std;int try_modulus(int,int);void main()try /代碼保護(hù)段代碼保護(hù)段coutModulus(5,2) is try_modulus(5,2)endl;coutModulus(3,0) is try_modulus(3,0)endl;coutModulus(8,5) is try_modulus(8,5)endl;catch(char *s) /處理異常處理異常cerrs;coutm_cause = CFileException:fileNotFound ) printf( ERROR: File not foundn); else if(
12、 e-m_cause = CFileException: diskFull) printf( ERROR: Disk fulln); else if( e-m_cause = CFileException: endOfFile) printf( ERROR: End Of Filen);2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)3. ReportError()的例子 第8章 異常處理和診斷 8.2 MFC異常類CFile fileInput;CFileException ex;if (!fileInput.Open(TooManyBadDirs.DAT, CFile:modeRead, &
13、ex)/打開文件失敗打開文件失敗 ex.ReportError()();else / 打開文件成功打開文件成功 fileInput.Close()();2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)診斷服務(wù)第8章 異常處理和診斷 MFC提供的用于診斷程序的宏有:ASSERT、A SS E RT _ K I N D O F 、 A SS E RT _ VA L I D 、DEBUG_NEW、TRACE、TRACE0、TRACE1、TRACE2、TRACE3、VERIFY。2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)1. ASSERT第8章 異常處理和診斷 8.3 診斷服務(wù)ASSERT( boolean Exp
14、ression ); 如果參數(shù)不為真,這個宏就顯示一個診斷如果參數(shù)不為真,這個宏就顯示一個診斷信息對話框,并終止程序的運(yùn)行。如果參數(shù)信息對話框,并終止程序的運(yùn)行。如果參數(shù)為真,它不做任何事情。為真,它不做任何事情。 ASSERT僅在僅在MFC的調(diào)的調(diào)試試(Debug)版本中有效,版本中有效,在在MFC的發(fā)布的發(fā)布(Release)版本中,版本中,ASSERT語句不語句不再有效。再有效。 2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)2. VERIFY第8章 異常處理和診斷 VERIFY( boolean Expression ) ; 如果參數(shù)不為真,這個宏就顯示一個診如果參數(shù)不為真,這個宏就顯示一個診
15、斷信息對話框,并終止程序的運(yùn)行。如果參斷信息對話框,并終止程序的運(yùn)行。如果參數(shù)為真,它不做任何事情。數(shù)為真,它不做任何事情。 在在MFC的發(fā)布版本的發(fā)布版本中,它仍對參數(shù)進(jìn)行測中,它仍對參數(shù)進(jìn)行測試,但是當(dāng)參數(shù)為假時,試,但是當(dāng)參數(shù)為假時,不彈出診斷信息對話框。不彈出診斷信息對話框。 8.3 診斷服務(wù)2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)3. TRACE第8章 異常處理和診斷 TRACE( exp ); TRACE是一個在程序運(yùn)行時跟蹤變量是一個在程序運(yùn)行時跟蹤變量數(shù)值的便捷方法,它的用法和數(shù)值的便捷方法,它的用法和Printf完全完全相同,他的輸出是相同,他的輸出是Debug窗口。如:窗口。如:int m_value=100;for(int i=0;i5;i+)m_value+;TRACE(m_value = %d, m_value);8.3 診斷服務(wù)2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)小結(jié)tC+C+異常異常tMFCMFC異常類異常類t診斷服務(wù)診斷服務(wù)lASSERTASSERTlVERIFYVERIFYlTRACETRACE第8章 異常處理和診斷 2022-3-21C+面向?qū)ο蟪绦蛟O(shè)計(jì)t在在VC+6
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年下沉市場消費(fèi)金融風(fēng)險識別與防控技術(shù)研究報告
- 藥品資質(zhì)使用管理制度
- 藥學(xué)設(shè)施設(shè)備管理制度
- 藥店員工工作管理制度
- 藥店用藥咨詢管理制度
- 菜譜生產(chǎn)車間管理制度
- 設(shè)備儀器事故管理制度
- 設(shè)備備件外委管理制度
- 設(shè)備拆除作業(yè)管理制度
- 設(shè)備維修保狀管理制度
- 印度尼西亞勞動法
- 工業(yè)機(jī)器人的發(fā)展現(xiàn)狀和未來趨勢
- 安寧療護(hù)疼痛管理指南的系統(tǒng)評價
- (完整版)語文作文紙方格紙模版(兩種格式任選)
- 建函201521號 廣鐵集團(tuán)建管處關(guān)于發(fā)布《鄰近營業(yè)線施工物理隔離防護(hù)辦法》的通知
- 健康管理師-第十六章-健康管理相關(guān)法律法規(guī)
- 審計(jì)學(xué)-中央財(cái)經(jīng)大學(xué)中國大學(xué)mooc課后章節(jié)答案期末考試題庫2023年
- 腎內(nèi)科學(xué)篇病例分析1
- 2023年高考英語二模試題分項(xiàng)匯編-09翻譯(教師版)(上海)
- GB/T 42596.3-2023機(jī)床安全壓力機(jī)第3部分:液壓機(jī)安全要求
- 黑龍江省教育科學(xué)規(guī)劃課題成果鑒定與結(jié)題驗(yàn)收評價表
評論
0/150
提交評論