C++程序設(shè)計(jì)語(yǔ)言揣錦華異常處理_第1頁(yè)
C++程序設(shè)計(jì)語(yǔ)言揣錦華異常處理_第2頁(yè)
C++程序設(shè)計(jì)語(yǔ)言揣錦華異常處理_第3頁(yè)
C++程序設(shè)計(jì)語(yǔ)言揣錦華異常處理_第4頁(yè)
C++程序設(shè)計(jì)語(yǔ)言揣錦華異常處理_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第10章 異常處理第第10章章 異常處理異常處理 10.1 異常處理機(jī)制異常處理機(jī)制10.2 異常處理的實(shí)現(xiàn)異常處理的實(shí)現(xiàn) 10.3 異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu) 第10章 異常處理10.1 異常處理機(jī)制異常處理機(jī)制 在一個(gè)大型軟件中,由于函數(shù)之間有著明確的分工和復(fù)雜的調(diào)用關(guān)系,發(fā)現(xiàn)錯(cuò)誤的函數(shù)往往不具備處理錯(cuò)誤的能力。因此,C+語(yǔ)言異常處理機(jī)制的基本思想是將異常的檢測(cè)與處理分離。當(dāng)在一個(gè)函數(shù)體中檢測(cè)到異常條件存在,但卻無(wú)法確定相應(yīng)的處理方法時(shí),該函數(shù)將引發(fā)一個(gè)異常,由函數(shù)的直接或間接調(diào)用者捕獲這個(gè)異常并處理這個(gè)錯(cuò)誤。 第10章 異常處理 如果程序始終沒(méi)有處理這個(gè)異常,最終它會(huì)被

2、傳到C+運(yùn)行系統(tǒng)那里,運(yùn)行系統(tǒng)捕獲異常后,通常只是簡(jiǎn)單地終止這個(gè)程序。 由于異常處理機(jī)制使得異常的引發(fā)和處理不必在同一函數(shù)中,這樣,底層的函數(shù)可以著重解決具體問(wèn)題而不必過(guò)多地考慮對(duì)異常的處理;上層調(diào)用者可以在適當(dāng)?shù)奈恢迷O(shè)計(jì)對(duì)不同類型異常的處理。第10章 異常處理10.2 異常處理的實(shí)現(xiàn)異常處理的實(shí)現(xiàn) 1throw語(yǔ)法 throw; 當(dāng)某段程序發(fā)現(xiàn)了自己不能處理的異常,就可以使用throw語(yǔ)句將這個(gè)異常拋擲給調(diào)用者。throw語(yǔ)句的使用與return語(yǔ)句相似,如果程序中有多處要拋擲異常,應(yīng)該用不同的表達(dá)式類型來(lái)互相區(qū)別,表達(dá)式的值不能用來(lái)區(qū)別不同的異常。第10章 異常處理 2try塊語(yǔ)法 try

3、 復(fù)合語(yǔ)句 try語(yǔ)句后的復(fù)合語(yǔ)句是代碼的保護(hù)段。如果預(yù)料某段程序代碼(或?qū)δ硞€(gè)函數(shù)的調(diào)用)有可能發(fā)生異常,就將它放在try語(yǔ)句之后。如果這段代碼(或被調(diào)函數(shù))運(yùn)行時(shí)真的遇到異常情況,其中的throw表達(dá)式就會(huì)拋擲這個(gè)異常。 第10章 異常處理3catch語(yǔ)法catch(異常類型1參數(shù)1)/針對(duì)異常類型1的處理語(yǔ)句catch(異常類型2參數(shù)2)/針對(duì)異常類型2的處理語(yǔ)句.catch(異常類型n參數(shù)n)第10章 異常處理 /針對(duì)異常類型n的處理語(yǔ)句 catch語(yǔ)句后的復(fù)合語(yǔ)句是異常處理程序,捕獲由throw表達(dá)式拋擲的異常。異常類型聲明部分指明語(yǔ)句所處理的異常類型,它與函數(shù)的形參相類似,可以是某

4、個(gè)類型的值,也可以是引用。這里的類型可以是任何有效的數(shù)據(jù)類型,包括C+的類。當(dāng)異常被拋擲以后,catch語(yǔ)句便依次被檢查。 第10章 異常處理 異常處理的執(zhí)行過(guò)程如下: 控制通過(guò)正常的順序執(zhí)行到達(dá)try語(yǔ)句,然后執(zhí)行try塊內(nèi)的保護(hù)段。 如果在保護(hù)段執(zhí)行期間沒(méi)有引起異常,那么跟在try塊后的catch語(yǔ)句就不執(zhí)行,程序從異常被拋擲的try塊后跟隨的最后一個(gè)catch語(yǔ)句后面的語(yǔ)句繼續(xù)執(zhí)行下去。 如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任何函數(shù)中(直接或間接的調(diào)用)有異常被拋擲,則從通過(guò)throw創(chuàng)建的對(duì)象中創(chuàng)建一個(gè)異常對(duì)象(這隱含指可能包含一個(gè)拷貝構(gòu)造函數(shù))。 第10章 異常處理 這一點(diǎn)上,編譯器

5、能夠處理拋擲類型的異常,在更高執(zhí)行上下文中尋找一個(gè)catch語(yǔ)句(或一個(gè)能處理任何類型異常的catch處理程序)。catch處理程序按其在try塊后出現(xiàn)的順序被檢查。如果沒(méi)有找到合適的處理程序,則繼續(xù)檢查下一個(gè)動(dòng)態(tài)封閉的try塊。此處理繼續(xù)下去,直到最外層的封閉try塊被檢查完。第10章 異常處理 如果匹配的處理器未找到,則terminate()將被自動(dòng)調(diào)用,而函數(shù)terminate()的默認(rèn)功能是調(diào)用abort終止程序。 如果找到了一個(gè)匹配的catch處理程序,且它通過(guò)值進(jìn)行捕獲,則其形參通過(guò)拷貝異常對(duì)象進(jìn)行初始化。如果它通過(guò)引用進(jìn)行捕獲,則參量被初始化為指向異常對(duì)象,在形參被初始化之后,“

6、循環(huán)展開(kāi)?!钡倪^(guò)程開(kāi)始。這包括對(duì)那些在與catch處理器相對(duì)應(yīng)的try塊開(kāi)始和異常丟棄地點(diǎn)之間創(chuàng)建的(但尚未析構(gòu)的)所有自動(dòng)對(duì)象的析構(gòu)。 第10章 異常處理 【例10-1】處理除零異常例題。 #include intDiv(intx,inty);/整數(shù)除法函數(shù)原型聲明 voidmain() try /由于除法運(yùn)算有可能出現(xiàn)除零異常,因此放在try塊中 cout5/2=Div(5,2)endl;cout8/0=Div(8,0)endl;cout7/1=Div(7,1)endl;第10章 異常處理 catch(int)/捕獲整數(shù)異常coutexceptionofdividingzero.endl;

7、coutthatisok.endl; intDiv(intx,inty) if(y=0)throwy; /如果整數(shù)為零,拋擲一個(gè)整數(shù)異常 第10章 異常處理 returnx/y; 程序運(yùn)行結(jié)果為 5/2=2 exceptionofdividingzero. thatisok. 從運(yùn)行結(jié)果可以看出,當(dāng)執(zhí)行下列語(yǔ)句時(shí),在函數(shù)Div()中發(fā)生除零異常。 cout8/0=Div(8,0)endl; 第10章 異常處理 異常被拋擲后,在main()函數(shù)中被捕獲,異常處理程序輸出有關(guān)信息后,程序流程跳轉(zhuǎn)到主函數(shù)的最后一條語(yǔ)句,輸出“thatisok.”,而函數(shù)Div()中的下列語(yǔ)句沒(méi)有被執(zhí)行: cout7

8、/1=Div(7,1)endl; catch處理程序的出現(xiàn)順序很重要,因?yàn)樵谝粋€(gè)try塊中,異常處理程序是按照它出現(xiàn)的順序被檢查的。只要找到一個(gè)匹配的異常類型,后面的異常處理都將被忽略。例如,在下面的異常處理塊中,首先出現(xiàn)的是catch(.),它可以捕獲任何異常,在任何情況下,其它的catch語(yǔ)句都不被檢查。因此,catch(.)應(yīng)該放在最后。 第10章 異常處理/.try/.catch(.)/只在這里處理所有的異常/錯(cuò)誤:后面的兩個(gè)異常處理程序段不會(huì)被檢查catch(constchar*str)第10章 異常處理 coutCaughtexception:strendl; catch(int)

9、 /處理整型異常 在VC+6.0環(huán)境中,為了使用異常處理機(jī)制,需要進(jìn)行如下設(shè)置:打開(kāi)ProjectSettings對(duì)話框,選擇CC+選項(xiàng)卡,在Category欄中選擇C+Lauguage,然后選擇EnableExceptionHandling。第10章 異常處理 為了加強(qiáng)程序的可讀性,使用戶能夠方便地知道所使用的函數(shù)會(huì)拋擲哪些異常,可以在函數(shù)的聲明中列出這個(gè)函數(shù)可能拋擲的所有異常類型。例如: voidfun()throw(A,B,C,D) 這表明函數(shù)throw()能夠且只能夠拋擲類型A、B、C、D的異常。 如果在函數(shù)的聲明中沒(méi)有包括異常接口聲明,則此函數(shù)可以拋擲任何類型的異常。 第10章 異常

10、處理 例如: voidfun(); 一個(gè)不拋擲任何類型異常的函數(shù)可以進(jìn)行如下形式的聲明: voidfun()throw();第10章 異常處理10.3 異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu) C+異常處理的真正能力不僅在于它能夠處理各種不同類型的異常,還在于它具有在異常拋擲前為構(gòu)造的所有局部對(duì)象自動(dòng)調(diào)用析構(gòu)函數(shù)的能力。 在程序中,找到一個(gè)匹配的catch異常處理后,如果catch語(yǔ)句的異常類型聲明是一個(gè)值參數(shù),則其初始化方式是復(fù)制被拋擲的異常對(duì)象;如果catch語(yǔ)句的異常類型聲明是一個(gè)引用,則其初始化方式是使該引用指向異常對(duì)象。第10章 異常處理 當(dāng)catch語(yǔ)句的異常類型聲明參數(shù)被初始

11、化后,棧的展開(kāi)過(guò)程便開(kāi)始了。這包括從對(duì)應(yīng)的try塊開(kāi)始到異常被拋擲處之間對(duì)構(gòu)造(且尚未析構(gòu))的所有自動(dòng)對(duì)象進(jìn)行析構(gòu)。析構(gòu)的順序與構(gòu)造的順序相反。然后程序從最后一個(gè)catch處理之后開(kāi)始恢復(fù)執(zhí)行。 【例10-2】使用帶析構(gòu)語(yǔ)義的類的C+異常處理例題。 #include voidMyFunc(void); classExpt public: Expt();第10章 異常處理Expt();constchar*ShowReason()constreturnExpt類異常。;classDemopublic:Demo();Demo();第10章 異常處理;Demo:Demo()cout構(gòu)造Demo。end

12、l;Demo:Demo()cout析構(gòu)Demo。endl;voidMyFunc()第10章 異常處理DemoD;cout在MyFunc()中拋擲Expt類異常。endl;throwExpt();intmain()cout在main()函數(shù)中。endl;trycout在try塊中,調(diào)用MyFunc()。endl;第10章 異常處理 MyFunc();catch(ExptE)cout在catch異常處理程序中。endl;cout捕獲到Expt類型異常:;coutE.ShowReason()endl;catch(char*str)第10章 異常處理cout捕獲到其它的異常:strendl;cout回

13、到main()函數(shù)。從這里恢復(fù)執(zhí)行。endl;return0;程序運(yùn)行結(jié)果為在main()函數(shù)中在try塊中,調(diào)用MyFunc()構(gòu)造Demo在MyFunc()中拋擲Expt類異常析構(gòu)Demo第10章 異常處理在catch異常處理程序中捕獲到Expt類型異常:Expt類異常回到main()函數(shù),從這里恢復(fù)執(zhí)行注意,本例中,在兩個(gè)catch處理器中都說(shuō)明了異常參量(catch語(yǔ)句的參量):catch(ExptE)/.catch(char*str)/.第10章 異常處理 其實(shí),也可以不說(shuō)明這些參量(E和str)。在很多情況下,只要通知處理程序有某個(gè)特定類型的異常已經(jīng)產(chǎn)生就足夠了。但是在需要訪問(wèn)異常對(duì)象時(shí)就要說(shuō)明參量,否則,將無(wú)法訪問(wèn)catch處理程序語(yǔ)句中的那個(gè)對(duì)象。例如: catch(Expt) /在這里不能訪問(wèn)Expt異常對(duì)象 用

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論