錢能C++程序設(shè)計(jì)教程15

上傳人:dfg****19 文檔編號(hào):248191386 上傳時(shí)間:2024-10-22 格式:PPT 頁(yè)數(shù):25 大?。?8KB
收藏 版權(quán)申訴 舉報(bào) 下載
錢能C++程序設(shè)計(jì)教程15_第1頁(yè)
第1頁(yè) / 共25頁(yè)
錢能C++程序設(shè)計(jì)教程15_第2頁(yè)
第2頁(yè) / 共25頁(yè)
錢能C++程序設(shè)計(jì)教程15_第3頁(yè)
第3頁(yè) / 共25頁(yè)

下載文檔到電腦,查找使用更方便

15 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《錢能C++程序設(shè)計(jì)教程15》由會(huì)員分享,可在線閱讀,更多相關(guān)《錢能C++程序設(shè)計(jì)教程15(25頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二層,第三層,第四層,第五層,*,*,*,C+,程序設(shè)計(jì)教程,(,第二版,),第十五章,異常,Chapter 15,Exception,清華大學(xué)出版社,錢 能,10/22/2024,1,異常是一種程序控制機(jī)制,與函數(shù)機(jī)制獨(dú)立和互補(bǔ),函數(shù)是一種以棧結(jié)構(gòu)展開的上下函數(shù)銜接的程序控制系統(tǒng),異常是另一種控制結(jié)構(gòu),它依附于棧結(jié)構(gòu),卻可以同時(shí)設(shè)置多個(gè)異常類型作為網(wǎng)捕條件,從而以類型匹配在棧機(jī)制中跳躍回饋,.,異常設(shè)計(jì)目的:,棧機(jī)制是一種高度節(jié)律性控制機(jī)制,面向?qū)ο缶幊虆s要求對(duì)象之間有方向、有目的的控制傳動(dòng),從一開始,異常就是沖著改變程序控制結(jié)構(gòu),以適

2、應(yīng)面向?qū)ο蟪绦蚋行У毓ぷ鬟@個(gè)主題,而不是僅為了進(jìn)行錯(cuò)誤處理。,異常設(shè)計(jì)出來(lái)之后,卻發(fā)現(xiàn)在錯(cuò)誤處理方面獲得了最大的好處,10/22/2024,2,第十五章內(nèi)容,錯(cuò)誤處理的復(fù)雜性,(Error,Proccessing,Complexity),使用異常,(Using Exception),捕捉異常,(Catching Exception),異常申述,(Exception Description),異常繼承體系,(Exception Inheritance System),異常應(yīng)用,(Exception Applications),非錯(cuò)誤處理,(Non-Error,Proccessing,),10/

3、22/2024,3,1.,錯(cuò)誤處理的復(fù)雜性,(Error,Proccessing,Complexity),傳統(tǒng)的錯(cuò)誤處理方式:,1,遇到錯(cuò)誤,終止運(yùn)行,,低級(jí)粗暴,2,遇到錯(cuò)誤,循調(diào)用返回給上層函數(shù)一個(gè)錯(cuò)誤信息,,忽略了模塊體系,3,遇到錯(cuò)誤,改變?nèi)皱e(cuò)誤變量的值,并函數(shù)返回,,破壞了程序結(jié)構(gòu),4,遇到錯(cuò)誤,調(diào)用事先設(shè)計(jì)好的下層錯(cuò)誤處理函數(shù),,可惜錯(cuò)誤往往不是自己所能解決的了的!,10/22/2024,4,程序運(yùn)作實(shí)情,可以將程序運(yùn)行看作是諸多模塊的工作及相互往來(lái),一個(gè)模塊發(fā)生的錯(cuò)誤,需要借助于另一個(gè)模塊進(jìn)行修復(fù),每個(gè)模塊包含一個(gè)層層調(diào)用的函數(shù)體系,發(fā)生錯(cuò)誤后,如果層層函數(shù)返回,則不但動(dòng)作緩慢

4、,而且錯(cuò)誤信息丟失,失去處理的針對(duì)性,發(fā)生錯(cuò)誤,說(shuō)明模塊服務(wù)失敗,需要在主體模塊中找說(shuō)法給予必要的處理,.,不同的系統(tǒng),其主體模塊是不同的,決定了“說(shuō)法”也是不同的,計(jì)算元素位置,if(vi,溢出,),說(shuō)明元素不存在,if(i,=size),下標(biāo)溢出,接受外來(lái)申請(qǐng),if(vi,溢出,),說(shuō)明資源不足,應(yīng)用模塊,2,應(yīng)用模塊,1,向量模塊,10/22/2024,5,函數(shù)機(jī)制,本質(zhì)上是一種過(guò)程控制機(jī)制,對(duì)面向?qū)ο蟪绦騺?lái)說(shuō),進(jìn)行從發(fā)現(xiàn)錯(cuò)誤到處理錯(cuò)誤的設(shè)計(jì),是一個(gè)超出過(guò)程控制能力的龐大控制體系,10/22/2024,6,2.,使用異常,(Using Exception),錯(cuò)誤處理示意:,放棄一棵子樹,

5、循調(diào)用鏈跳到祖先函數(shù),發(fā)現(xiàn)錯(cuò)誤處,10/22/2024,7,異常處理的語(yǔ)法:,1,框定異常發(fā)生的可能范圍,2,定義異常處理,3,拋擲異常,int,main(int,argc,char*,argv,),ifstream,in(argv1);,try,if,(!in,),throw,string(argv1);,catch,(string,s),cout,s+File,Opening Error.n;,return,1;,for,(string,s;,getline(in,s);),cout,s“n”;,10/22/2024,8,異常擅長(zhǎng)于在函數(shù)調(diào)用鏈中騰挪,void,f0(),throw,str

6、ing(“,請(qǐng)?zhí)幚?n”);,void,f1()f0();,void,f2()f1();,void,f3()f2();,void,f4()f3();,void,f5()f4();,int,main(),try,f5();,catch,(string,),cout,“,處理中,n”;,10/22/2024,9,系統(tǒng)中提供了標(biāo)準(zhǔn)異常在標(biāo)準(zhǔn)模塊中若發(fā)生標(biāo)準(zhǔn)錯(cuò)誤,會(huì)自動(dòng)拋擲標(biāo)準(zhǔn)異常,無(wú)須程序員指定,throw,地點(diǎn),int,*,f(),return,new int,1000000000;,i,nt,main(),int,*sp;,try,sp=f();,catch,(bad_alloc,),cout,

7、Bad Allocation.n;,return,1;,/using sp;,10/22/2024,10,3.,捕捉異常,(Catching Exception),類型匹配,異常捕捉的類型匹配之苛刻程度可以和模板的類型匹配媲美,它不允許相容類型的隱式轉(zhuǎn)換,比如,拋擲,char,類型用,int,型就捕捉不到例如下列代碼不會(huì)輸出,“,int,exception.,”,,從而也不會(huì)輸出,“,That,s ok.,”,int,main(),try,throw,H,;,catch,(,int,),cout,int,exception.n;,cout,Thats ok.n;,10/22/2024,11,異

8、常可以函數(shù)為依托,層層布網(wǎng):,下層捕捉失敗后,拋擲會(huì)繼續(xù)上傳,觸動(dòng)上層捕捉直至系統(tǒng)最后一道防線,例如,下列代碼將輸出“,int,exception.”:,void,f(),try,throw,12,;,catch,(,char,),cout,“char exception.n”;,int,main(),try,f();,catch,(,int,),cout,int,exception.n;,10/22/2024,12,4.,異常申述,(Exception Description),布網(wǎng)是按類型,以便捕捉,申述也是按類型,規(guī)定拋擲的類型范圍,申述是函數(shù)對(duì)拋擲的過(guò)濾網(wǎng)格沒(méi)有函數(shù)的異常類型申述,拋擲

9、是穿透不出函數(shù)的,10/22/2024,13,沒(méi)有申述的函數(shù),默認(rèn)為任何拋擲都可穿透該函數(shù),class A;,class B;,void f1()throw(A,B);,void f2();,void f3()throw();,對(duì)于函數(shù),g,中的調(diào)用,可能捕捉到函數(shù),f1,的和函數(shù),f2,的異常拋擲,但捕捉不到函數(shù),f3,中的任何拋擲,注:同一個(gè)函數(shù),其聲明與定義中的申述應(yīng)一致,class A;,class B;,void f1()throw(A,B),if(.)throw A;,void f2(),if(.)throw B;,void f3()throw(),if(.)throw A;,vo

10、id g(),try,f1();,f2();,f3();,catch(A,),cout,“exception in An”;,catch(B,),cout,“exception in Bn”;,10/22/2024,14,捉不住處理:,拋擲而無(wú)布網(wǎng)捕捉的異常將直逼系統(tǒng)的最后一道防線,void f(),if(.),throw A,;,void g(),try,f();,catch(B,),cout,“exception Bn”;,int,main(),g();,throw A,將穿透函數(shù),f,,,g,和,main,,抵達(dá)系統(tǒng)的最后一道防線,激發(fā),terminate,函數(shù)該函數(shù)調(diào)用引起運(yùn)行終止的,

11、abort,函數(shù),最后一道防線的函數(shù)可以由程序員設(shè)置從而規(guī)定其終止前的行為,10/22/2024,15,5.,異常繼承體系,(Exception Inheritance System),異常拋擲的捕捉是類型匹配的,.,關(guān)乎類型的匹配自然納入類機(jī)制的范疇,.,因而,異常的多態(tài)是必不可少的,.,有了異常的多態(tài),就不但可以按函數(shù)調(diào)用鏈層撒網(wǎng),捕捉拋擲,還可以按類的層次進(jìn)行體系化異常捕捉,10/22/2024,16,拋擲子類可被基類捕捉,try,if(.),throw,OtherErr,;,catch,(MyException,&me),if,(string(me.what,()=,HardwareE

12、rr,)./,停機(jī),if,(string(me.what,()=,PerformErr,)./,加工件離機(jī),停機(jī),if,(string(me.what,()=,OtherErr,)./,粗暴停機(jī),catch,(exception,&e),cout,StandardExceptionn,;/,停機(jī),10/22/2024,17,6.,異常應(yīng)用,(Exception Applications),異常特別適合于一種封閉的模塊想要設(shè)法把出乎意料的信息傳出去,作為封閉的模塊,其輸出信息的狀態(tài)模式是規(guī)定的,但當(dāng)出現(xiàn)出乎意料的情況,無(wú)法完成模塊任務(wù)的時(shí)候,就談不上輸出信息了用異常指引到另一個(gè)狀態(tài)處理器是明智的

13、,10/22/2024,18,構(gòu)造函數(shù):,正象一個(gè)封閉的模塊,輸出狀態(tài)是一個(gè)新創(chuàng)對(duì)象任何創(chuàng)建過(guò)程中的錯(cuò)誤(例如,動(dòng)態(tài)內(nèi)存申請(qǐng)失敗等)都會(huì)導(dǎo)致模板的出乎意料這時(shí)候的狀態(tài)是不能接續(xù)后繼操作的,如:捆綁對(duì)象的操作因?yàn)闆](méi)有對(duì)象而招致失敗如果敢于正常返回,則又招致荒謬的結(jié)果,class,Date,int,year,month,day;,void,init(,int,y,int,m,int,d),if,(y,1|m12|d31),return,;/?,public,:,Date(,int,y=2000,int,m=1,int,d=1),:,year(y),month(m),day(d,),init();,

14、void,print(),cout,year“-”month“-”,day“n”;,;,int,main(),Date ad(2000,13,1);,ad.print,();/,荒謬,:,月份為,13,10/22/2024,19,異常操作應(yīng)該恢復(fù)到對(duì)類對(duì)象進(jìn)行創(chuàng)建和使用以前的狀態(tài),void,f(),Date(2000,13,1);,ad.print,();,int,main(),try,f();,/,其他操作,catch,(out_of_range,),cout,“,對(duì)象創(chuàng)建失敗,改換門庭”,;,class,Date,int,year,month,day;,void,init(,int,y,i

15、nt,m,int,d),if,(y,1|m12|d31),throw,out_of_range,;,public,:,Date(,int,y=2000,int,m=1,int,d=1),:,year(y),month(m),day(d,),init();,void,print(),cout,year“-”month“-”,day,getRadius,();,else,sp-rotate();,10/22/2024,21,動(dòng)態(tài)轉(zhuǎn)型,:,對(duì)引用的動(dòng)態(tài)轉(zhuǎn)型,其結(jié)果不是指針,而是一個(gè)對(duì)象,因此無(wú)法以指針值判斷也無(wú)法根據(jù)結(jié)果值,(,對(duì)象,),來(lái)得出對(duì)象的類型因而,即使轉(zhuǎn)型失敗也無(wú)法逆轉(zhuǎn)后繼執(zhí)行次序但是引

16、用動(dòng)態(tài)轉(zhuǎn)型如果失敗,將會(huì)拋擲一個(gè)標(biāo)準(zhǔn)異常,bad_cast,,這就給程序員提供了實(shí)施多態(tài)的手段,int,main(),Circle c;,Rectangle r;,h(c,);/,引用的動(dòng)態(tài)轉(zhuǎn)型,h(r,);,class,Shape,public,:,virtual double,area()=0;,;,class,Circle:,public,Shape,public,:,double,area(),void,getRadius,(),;,class,Rectangle:,public,Shape,public,:,double,area(),void,rotate(),;,void,h(Shape,&,rs,),try,dynamic_cast,(,rs).getRadius,();,catch(bad_cast,),r,s.rotate,();,10/22/2024,22,7.,非錯(cuò)誤處理,(Non-Error,Proccessing,),循環(huán)控制,多重循環(huán)控制中,當(dāng)某個(gè)條件滿足時(shí),需要立刻退出所有循環(huán)體時(shí),一般用,goto,語(yǔ)句反而比較現(xiàn)實(shí)否則一重一重地退,編程復(fù)雜,性能也連累

展開閱讀全文
溫馨提示:
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. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!