異常處理課件_第1頁(yè)
異常處理課件_第2頁(yè)
異常處理課件_第3頁(yè)
異常處理課件_第4頁(yè)
異常處理課件_第5頁(yè)
已閱讀5頁(yè),還剩25頁(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)介

高質(zhì)量C++編程異常處理本章包含如下內(nèi)容:1異常處理機(jī)制2異常處理實(shí)現(xiàn)

3異常處理中的構(gòu)造與析構(gòu)

時(shí)間:學(xué)時(shí)教學(xué)方法:PPT+練習(xí)程序中常見(jiàn)的錯(cuò)誤有兩大類:語(yǔ)法錯(cuò)誤和運(yùn)行錯(cuò)誤。在編譯時(shí),編譯系統(tǒng)能發(fā)現(xiàn)程序中的語(yǔ)法錯(cuò)誤。在設(shè)計(jì)程序時(shí),應(yīng)當(dāng)事先分析程序運(yùn)行時(shí)可能出現(xiàn)的各種意外的情況,并且分別制訂出相應(yīng)的處理方法,這就是程序的異常處理的任務(wù)。需要說(shuō)明,只要出現(xiàn)與人們期望的情況不同,都可以認(rèn)為是異常,并對(duì)它進(jìn)行異常處理。因此,所謂異常處理指的是對(duì)運(yùn)行時(shí)出現(xiàn)的差錯(cuò)以及其他例外情況的處理。異常處理機(jī)制

在執(zhí)行一個(gè)函數(shù)過(guò)程中出現(xiàn)異常,可以不在本函數(shù)中立即處理,而是發(fā)出一個(gè)信息,傳給它的上一級(jí),它的上級(jí)捕捉到這個(gè)信息后進(jìn)行處理。如果上一級(jí)的函數(shù)也不能處理,就再傳給其上一級(jí),由其上一級(jí)處理。如此逐級(jí)上送,如果到最高一級(jí)還無(wú)法處理,最后只好異常終止程序的執(zhí)行。好處是使底層的函數(shù)專門(mén)用于解決實(shí)際任務(wù),而不必再承擔(dān)處理異常的任務(wù),以減輕底層函數(shù)的負(fù)擔(dān),而把處理異常的任務(wù)上移到某一層去處理。這樣可以提高效率。異常處理實(shí)現(xiàn)函數(shù)f()捕獲并處理異常函數(shù)g()函數(shù)h()引發(fā)異常調(diào)用關(guān)系異常傳播方向……異常處理實(shí)現(xiàn)有三個(gè)關(guān)鍵字:try,throw,catch拋擲異常捕獲并處理異常

throw<表達(dá)式>;try{復(fù)合語(yǔ)句

}catch(異常類型聲明){

復(fù)合語(yǔ)句

}

catch(異常類型聲明){

復(fù)合語(yǔ)句

}三個(gè)關(guān)鍵字各司其職throw:負(fù)責(zé)發(fā)現(xiàn)異常的報(bào)警,拋擲異常對(duì)象try:設(shè)置了一個(gè)偵錯(cuò)范圍,又叫保護(hù)段,是個(gè)區(qū)域catch:負(fù)責(zé)處理捕獲來(lái)的異常(包括繼續(xù)拋擲異常)異常處理實(shí)現(xiàn)程序運(yùn)行結(jié)果如下:654↙(輸入a,b,c的值)9.92157(計(jì)算出三角形的面積)11.52↙(輸入a,b,c的值)0.726184(計(jì)算出三角形的面積)121↙(輸入a,b,c的值)a=1,b=2,c=1,thatisnotatriangle!(異常處理)//計(jì)算三角形的面積的函數(shù)doubletriangle(doublea,doubleb,doublec){doubles=(a+b+c)/2;//當(dāng)不符合三角形條件拋出異常信息if(a+b<=c||b+c<=a||c+a<=b)throwa;

returnsqrt(s*(s-a)*(s-b)*(s-c));}異常處理實(shí)現(xiàn)1:控制通過(guò)正常的順序執(zhí)行到達(dá)try語(yǔ)句,然后執(zhí)行try塊內(nèi)的保護(hù)段。2:如果在保護(hù)段執(zhí)行期間沒(méi)有引起異常,那么跟在try塊后的catch語(yǔ)句就不執(zhí)行,程序從異常被拋擲的try塊后跟隨的最后一個(gè)catch語(yǔ)句后面的語(yǔ)句繼續(xù)執(zhí)行下去。3:如果在保護(hù)段執(zhí)行期間或在保護(hù)段調(diào)用的任何函數(shù)中(直接或間接的調(diào)用)有異常被拋擲,則從通過(guò)throw創(chuàng)建的對(duì)象中創(chuàng)建一個(gè)異常對(duì)象異常處理實(shí)現(xiàn)4:如果匹配的處理器未找到,則terminate()將被自動(dòng)調(diào)用,而函數(shù)terminate()的默認(rèn)功能是調(diào)用abort終止程序。5:如果找到了一個(gè)匹配的catch處理程序,且它通過(guò)值進(jìn)行捕獲,則其形參通過(guò)拷貝異常對(duì)象進(jìn)行初始化。如果它通過(guò)引用進(jìn)行捕獲,則參量被初始化為指向異常對(duì)象,在形參被初始化之后,“循環(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)。異常處理實(shí)現(xiàn)這里的:

try{//

“偵錯(cuò)范圍”

throw…

;

“拋擲異?!?/p>

//…

}

catch(…

){

}

“異常處理”這便形成了”異常處理機(jī)制”.異常處理實(shí)現(xiàn)有一個(gè)表達(dá)式y(tǒng)=√x(x>=0),x在程序執(zhí)行時(shí)從鍵盤(pán)輸入的,有可能會(huì)輸入負(fù)數(shù)給x。這是一種人為引起的錯(cuò)誤,應(yīng)進(jìn)行處理。異常處理實(shí)現(xiàn)catch可有多個(gè)intmain(){try{throw表達(dá)式;cout<<“能執(zhí)行到這里嗎?”<<endl;//不應(yīng)該執(zhí)行這條語(yǔ)句

}//catch子句可有多個(gè)

catch(type1&e){...}catch(type2&e){...}catch(type3&e){...}catch(DevidedByZero&e){cerr<<e.what()<<endl;}//other從這里開(kāi)始執(zhí)行

return0;}catch{…}在最后異常處理實(shí)現(xiàn)多個(gè)catch示意圖異常是通過(guò)拋出對(duì)象而引發(fā)的。該對(duì)象的類型決定應(yīng)該激活哪個(gè)處理代碼。被選中的處理代碼是調(diào)用鏈(指函數(shù)調(diào)用鏈)中與該對(duì)象類型匹配且離拋出異常位置最近的那個(gè)catch。見(jiàn)下頁(yè)程序示例。try{}catch(…){}catch(…){}catch(…){}throw異常對(duì)象引發(fā)哪一個(gè)由異常對(duì)象的類型決定。異常處理實(shí)現(xiàn)查找匹配的處理代碼在查找匹配的catch期間,找到的catch不一定是與異常最匹配的那個(gè)catch,相反,將選中第一個(gè)找到的可以處理該異常的catch。因此,在catch子句列表中,最特殊的catch必須最先出現(xiàn)。異常與catch異常說(shuō)明符匹配的規(guī)則比匹配實(shí)參和形參類型的規(guī)則更嚴(yán)格,大多數(shù)轉(zhuǎn)換都不允許——除下面幾種可能的區(qū)別之外,異常的類型與catch說(shuō)明符的類型必須完全匹配:允許從非const到const的轉(zhuǎn)換。也就是說(shuō),非const對(duì)象的throw可以與指定接受const引用的catch匹配。允許從派生類型型到基類類型的轉(zhuǎn)換。異常處理實(shí)現(xiàn)intmain(){try{intex=0;throwex;}catch(float&e) //這里從int到float的轉(zhuǎn)換不允許

{cout<<"floatcatched"<<endl;}catch(int&e) //這個(gè)catch捕獲到異常

{cout<<"intcatched"<<endl;}return0;}異常處理實(shí)現(xiàn)classBase{};classDerived:publicBase{};intmain(){try{Derivedd;throwd;}catch(Base&e){//這個(gè)轉(zhuǎn)換是允許的,waringC4286cout<<"Base"<<endl;}catch(Derived&e){cout<<"Derived"<<endl;}return0;}異常處理實(shí)現(xiàn)異常將控制從throw轉(zhuǎn)移到匹配的catch執(zhí)行throw的時(shí)候,不會(huì)執(zhí)行跟在throw后面的語(yǔ)句,而是將控制從throw轉(zhuǎn)移到匹配的catch,該catch可以是同一函數(shù)中局部的catch,也可以在直接或間接調(diào)用發(fā)生異常的函數(shù)的另一個(gè)函數(shù)中??刂茝囊粋€(gè)地方傳到另一地方,這有兩個(gè)重要含義:1.沿著調(diào)用鏈的函數(shù)提早退出。2.一般而言,在處理異常的時(shí)候,拋出異常的塊中的局部存儲(chǔ)不存在了。異常處理實(shí)現(xiàn)普通函數(shù)catchtrythrowmain()try塊內(nèi)調(diào)用的函數(shù)trycatchthrowthrow123異常處理實(shí)現(xiàn)#include<iostream>usingnamespacestd;intmain(){ voidf1(); try

{ f1();//調(diào)用f1()

} catch(double)

{ cout<<"OK0!"<<endl;

} cout<<"end0"<<endl; return0;}voidf1(){ voidf2(); try

{ f2();//調(diào)用f2()

} catch(char)

{ cout<<"OK1!";

} cout<<"end1"<<endl;}異常處理實(shí)現(xiàn)voidf2(){ voidf3(); try

{ f3();//調(diào)用f3()

} catch(int)

{ cout<<"Ok2!"<<endl;

} cout<<"end2"<<endl;}voidf3(){ doublea=0; try

{//拋出double類型異常信息 throwa;

} catch(float)

{ cout<<"OK3!"<<endl;

} cout<<"end3"<<endl;}異常處理實(shí)現(xiàn)如果在try塊中定義了類對(duì)象,在建立該對(duì)象時(shí)要調(diào)用構(gòu)造函數(shù)。在執(zhí)行try塊的過(guò)程中如果發(fā)生了異常,此時(shí)流程立即離開(kāi)try塊。這樣流程就有可能離開(kāi)該對(duì)象的作用域而轉(zhuǎn)到其他函數(shù),因而應(yīng)當(dāng)事先做好結(jié)束對(duì)象前的清理工作,C++的異常處理機(jī)制會(huì)在throw拋出異常信息被catch捕獲時(shí),對(duì)有關(guān)的局部對(duì)象進(jìn)行析構(gòu)(析構(gòu)對(duì)象的順序與構(gòu)造的順序相反,然后執(zhí)行與異常信息匹配的catch塊中的語(yǔ)句。異常處理中的構(gòu)造與析構(gòu)#include<iostream>#include<string>usingnamespacestd;classStudent{public: Student(intn,stringnam)//定義構(gòu)造函數(shù)

{ cout<<"constructor-"<<n<<endl;num=n;name=nam;

} ~Student(){cout<<"destructor-"<<num<<endl;}//析構(gòu)函數(shù) voidget_data();//成員函數(shù)聲明private: intnum; stringname;};異常處理中的構(gòu)造與析構(gòu)在異常處理中處理析構(gòu)函數(shù)。voidStudent::get_data()//定義成員函數(shù){if(num==0) thrownum;//如num=0,拋出int型變量numelse cout<<num<<""<<name<<endl;//若num≠,輸出num,name//輸出信息,表示目前在get_data函數(shù)中cout<<"inget_data()"<<endl;}voidfun(){Studentstud1(1101,"Tan");//建立對(duì)象stud1stud1.get_data();//調(diào)用stud1的get_data函數(shù)Studentstud2(0,"Li");//建立對(duì)象stud2stud2.get_data();//調(diào)用stud2的get_data函數(shù)}異常處理中的構(gòu)造與析構(gòu)intmain(){cout<<"mainbegin"<<endl;//表示主函數(shù)開(kāi)始了cout<<"callfun()"<<endl;//表示調(diào)用fun函數(shù)try

{fun();

}//調(diào)用fun函數(shù)catch(intn){

cout<<"num="<<n<<",error!"<<endl;

}//表示num=0出錯(cuò)cout<<"mainend"<<endl;//表示主函數(shù)結(jié)束return0;}程序運(yùn)行結(jié)果如下:mainbegincallfun()constructor-11011101taninget_data()constructor-0destructor-0destructor-1101num=0,error!mainend異常處理中的構(gòu)造與析構(gòu)調(diào)用函數(shù)期間會(huì)經(jīng)常執(zhí)行析構(gòu)函數(shù)。在執(zhí)行析構(gòu)函數(shù)的時(shí)候,已經(jīng)引發(fā)了異常但還沒(méi)有處理它。如果在這個(gè)過(guò)程中析構(gòu)函數(shù)本身拋出新的異常,又會(huì)發(fā)生什么呢?答案是:在為某個(gè)異常進(jìn)行棧展開(kāi)的時(shí)候,析構(gòu)函數(shù)如果又拋出自己的未經(jīng)處理的另一個(gè)異常,將會(huì)導(dǎo)致調(diào)用標(biāo)準(zhǔn)庫(kù)terminate

函數(shù)。異常處理中的構(gòu)造與析構(gòu)//正確CTest::~CTest(){try{ stringe("異常"); throwe;

} catch(strin

溫馨提示

  • 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)論