




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、7第十章 異常處理習(xí)題第十章 異常處理習(xí)題一. 基本概念與基礎(chǔ)知識(shí)自測(cè)題10.1 填空題10.1.1 C+程序?qū)⒖赡馨l(fā)生異常的程序塊放在 (1) 中,緊跟其后可放置若干對(duì)應(yīng)的 (2) ,在前面所說(shuō)的塊中或塊所調(diào)用的函數(shù)中應(yīng)該有對(duì)應(yīng)的 (3) ,由它在不正常時(shí)拋出 (4) ,如與某一條 (5) 類型相匹配,則執(zhí)行該語(yǔ)句。該語(yǔ)句執(zhí)行完后,如未退出程序,則執(zhí)行 (6) 。如沒(méi)有匹配的語(yǔ)句,則交C+標(biāo)準(zhǔn)庫(kù)中的 (7) 處理。答案:(1)try塊(2)catch子句(3)throw表達(dá)式(4)異常(5)catch子句(6)后面的一條語(yǔ)句(7)terminate()10.1.2 throw表達(dá)式的行為有點(diǎn)
2、像函數(shù)的 (1) ,而catch子句有點(diǎn)像函數(shù)的 (2) 。函數(shù)的調(diào)用和異常處理的主要區(qū)別在于:建立函數(shù)調(diào)用所需的信息在 (3) 時(shí)已經(jīng)獲得,而異常處理機(jī)制要求 (4) 時(shí)的支撐。對(duì)于函數(shù),編譯器知道在哪個(gè)調(diào)用點(diǎn)上函數(shù)被真正調(diào)用,而對(duì)異常處理,異常是 (5) 發(fā)生的,并沿 (6) 查找異常處理子句,這與 (7) 多態(tài)是 (8) 。答案:(1)調(diào)用(2)定義(3)編譯(4)運(yùn)行(5)隨機(jī)(6)調(diào)用鏈逆向(7)運(yùn)行時(shí)的(8)不一樣的10.1.3 異常也適用類的層次結(jié)構(gòu),與虛函數(shù)的規(guī)則 (1) ,基類的異常 (2) 派生類異常catch子句處理,而反過(guò)來(lái)則 (3) 。答案:(1)相反(2)不能被(3
3、)能處理10.1.4 異常處理時(shí)與函數(shù)重載 (1) ,異常處理是由 (2) catch子句處理,而不是由 (3) catch子句處理,所以catch子句 (4) 是很重要的。答案:(1)解析不同(2)最先匹配到的(3)最佳匹配的(4)排列次序10.2 簡(jiǎn)答題10.2.1 當(dāng)在try塊中拋出異常后,程序最后是否回到try塊中,繼續(xù)執(zhí)行后面的語(yǔ)句?答:不會(huì)回到try塊中。10.2.2 什么叫做棧展開(stack unwinding)?異常在其中按怎樣的步驟尋求處理?答:因發(fā)生異常而逐步退出復(fù)合語(yǔ)句和函數(shù)定義,被稱為棧展開(stack unwinding)。棧展開才是異常處理的核心技術(shù)。尋找匹配的c
4、atch子句有固定的過(guò)程:如果throw表達(dá)式位于try塊中,則檢查與try塊相關(guān)聯(lián)的catch子句列表,看是否有一個(gè)子句能夠處理該異常,如果有匹配的,則該異常被處理;如果找不到匹配的catch子句,則在主調(diào)函數(shù)中繼續(xù)查找。如果一個(gè)函數(shù)調(diào)用在退出時(shí)帶有一個(gè)被拋出的異常未能處理,而且這個(gè)調(diào)用位于一個(gè)try塊中,則檢查與該try塊相關(guān)聯(lián)的catch子句列表,看是否有一個(gè)子句匹配,如果有,則處理該異常;如果沒(méi)有,則查找過(guò)程在該函數(shù)的主調(diào)函數(shù)中繼續(xù)進(jìn)行。即這個(gè)查找過(guò)程逆著嵌套的函數(shù)調(diào)用鏈向上繼續(xù),直到找到處理該異常的catch子句。只要遇到第一個(gè)匹配的catch子句,就會(huì)進(jìn)入該catch子句,進(jìn)行處理
5、,查找過(guò)程結(jié)束。10.2.3 為什么C+要求資源的取得最好放在構(gòu)造函數(shù)中,而資源的釋放在析構(gòu)函數(shù)中?答:退出調(diào)用鏈時(shí)必須釋放所有資源。隨著棧展開,在退出的復(fù)合語(yǔ)句和函數(shù)定義中聲明的局部變量的生命期也結(jié)束了。在棧中分配的局部量占用的資源也被釋放,由系統(tǒng)回收。但是如果函數(shù)動(dòng)態(tài)獲得過(guò)資源(包括用new運(yùn)算符取得的資源和打開的文件),因異常,這些資源的釋放語(yǔ)句可能被忽略,則這些資源將永遠(yuǎn)不會(huì)被自動(dòng)釋放。在棧展開期間,當(dāng)一個(gè)復(fù)合語(yǔ)句(或語(yǔ)句塊)或函數(shù)退出時(shí),在退出的域中有某個(gè)局部量是類對(duì)象,棧展開過(guò)程將自動(dòng)調(diào)用該對(duì)象的析構(gòu)函數(shù),完成資源的釋放。所以C+異常處理過(guò)程本質(zhì)上反映的是“資源獲取是由構(gòu)造函數(shù)實(shí)現(xiàn)
6、,而資源釋放是由析構(gòu)函數(shù)完成”這樣一種程序設(shè)計(jì)技術(shù)。10.2.4 為什么要有異常重新拋出?異常重新拋出與處理的次序及過(guò)程是怎樣的?答:當(dāng)catch語(yǔ)句捕獲一個(gè)異常后,可能不能完全處理異常,在完成某些操作后,catch子句可能決定該異常必須由函數(shù)鏈中更上級(jí)的函數(shù)來(lái)處理,這時(shí)catch子句可以重新拋出(rethrow)該異常,把異常傳遞給函數(shù)調(diào)用鏈中更上級(jí)的另一個(gè)catch子句,由它進(jìn)行進(jìn)一步處理。rethrow表達(dá)式仍為:throw;但僅有一個(gè)關(guān)鍵字,因?yàn)楫惓n愋驮赾atch語(yǔ)句中已經(jīng)有了,不必再指明。被重新拋出的異常就是原來(lái)的異常對(duì)象。但是重新拋出異常的catch子句總是做了些工作,也應(yīng)該把自
7、己做過(guò)的工作告訴下一個(gè)處理異常的catch子句,所以往往要對(duì)異常對(duì)象做一定修改,以表達(dá)某些信息,這時(shí)catch子句中的異常聲明必須被聲明為引用(參見上節(jié)),這樣修改才能真正在異常對(duì)象自身中,而不是在拷貝中進(jìn)行。10.2.5 什么是異常規(guī)范? 答:異常規(guī)范(exception specification)提供了一種方案,可以隨著函數(shù)聲明列出該函數(shù)可能拋出的異常,并保證該函數(shù)不會(huì)拋出任何其他類型的異常。10.2.6 當(dāng)異常被組織成類層次結(jié)構(gòu)時(shí),對(duì)應(yīng)catch子句應(yīng)怎樣排列?為什么?答:在處理類類型異常時(shí),catch子句的排列順序是非常重要的。當(dāng)異常被組織成類層次結(jié)構(gòu)時(shí),類類型的異常可以被該類類型的
8、公有基類的catch子句捕獲到。為了保證異常的處理由最合適的catch子句來(lái)處理,派生類類型的catch子句必須先出現(xiàn),以確保只有在沒(méi)有其他catch子句適用時(shí),才會(huì)進(jìn)入基類類型的catch子句。10.2.7 簡(jiǎn)述C+標(biāo)準(zhǔn)庫(kù)的異常類層次結(jié)構(gòu)。答:C+標(biāo)準(zhǔn)庫(kù)中的異常層次的根類被稱為exception,定義在庫(kù)的頭文件<exception>中,它是C+標(biāo)準(zhǔn)庫(kù)函數(shù)拋出的所有異常類的基類。C+標(biāo)準(zhǔn)庫(kù)還提供了一些類,可用在用戶編寫的程序中,以報(bào)告程序的不正常情況。這些預(yù)定義的錯(cuò)誤被分為兩大類:邏輯錯(cuò)誤(logic error)和運(yùn)行時(shí)錯(cuò)誤(run_time error)。邏輯錯(cuò)誤是那些由于程
9、序的內(nèi)部邏輯而導(dǎo)致的錯(cuò)誤或者違反了類的不變性的錯(cuò)誤。邏輯異常包括:invalid_argment異常,如果函數(shù)接收到一個(gè)無(wú)效的實(shí)參,就會(huì)拋出該異常。out_of_range異常,如果函數(shù)接收到一個(gè)不在預(yù)期范圍中的實(shí)參,則拋出該異常。length_error異常,用以報(bào)告企圖產(chǎn)生一個(gè)“長(zhǎng)度值超出最大允許值”的對(duì)象。domain_error異常,用以報(bào)告域錯(cuò)誤(domain error)。與此相對(duì),運(yùn)行時(shí)刻錯(cuò)誤是由于程序域之外的事件而引起的錯(cuò)誤。運(yùn)行時(shí)刻錯(cuò)誤只在程序執(zhí)行時(shí)才是可檢測(cè)的。運(yùn)行時(shí)異常包括:range_error異常,報(bào)告內(nèi)部計(jì)算中的范圍錯(cuò)誤。overflow_error異常,報(bào)告算術(shù)溢
10、出錯(cuò)誤。underflow_error異常,報(bào)告算術(shù)下溢錯(cuò)誤。以上三個(gè)異常是由runtime_error類派生的。bad_alloc異常。當(dāng)new()操作符不能分配所要求的存儲(chǔ)區(qū)時(shí),會(huì)拋出該異常。它是由基類exception派生的。二. 編程與綜合練習(xí)題10.3 利用C+標(biāo)準(zhǔn)庫(kù)的異常類結(jié)構(gòu),為順序?!纠?.6】添加異常處理機(jī)構(gòu)。棧滿時(shí)的處理是把棧空間加倍,原棧內(nèi)容拷入之后,再壓棧。解:未用利用C+標(biāo)準(zhǔn)庫(kù)的異常類結(jié)構(gòu),可由學(xué)生自己替換。#include<iostream>using namespace std;template<typename T>class pushO
11、nFullT _value;public:pushOnFull(T i)_value=i;T value()return _value;void print()cerr<<"棧滿,"<<value()<<"未壓入棧,棧需加倍."<<endl;template<typename T>class popOnEmptypublic:void print()cerr<<"棧已空,無(wú)法出棧"<<endl;template<typename T>cla
12、ss stackfailpublic:void print()cerr<<"棧空間無(wú)法加倍,請(qǐng)按任意鍵退出"<<endl;template<typename T>class Stackint top; /棧頂指針(下標(biāo))T *elements; /動(dòng)態(tài)建立的數(shù)值int maxSize; /棧最大允納的元素個(gè)數(shù)public:Stack(int=20); /棧如不指定大小,設(shè)為20元素Stack()delete elements;void Push(const T &data); /壓棧T Pop(); /彈出,top-T GetEl
13、em(int i)return elementsi; /返回指定元素,top不變void MakeEmpty()top= -1; /清空棧bool IsEmpty() constreturn top= -1; /判??誦ool IsFull() constreturn top=maxSize-1; /判棧滿void PrintStack(); /輸出棧內(nèi)所有數(shù)據(jù)void StackFull();template<typename T> Stack<T>:Stack(int maxs)maxSize=maxs;top=-1;elements=new T maxSize;
14、/建立棧空間template<typename T> void Stack<T>:PrintStack()for(int i=0;i<=top;i+) cout<<elementsi<<'t'cout<<endl;template<typename T> void Stack<T>:Push(const T &data)if(IsFull() throw pushOnFull<T>(data); /棧滿則拋出異常elements+top=data; /棧頂指針先加1,元
15、素再進(jìn)棧,top是指向棧頂元素template<typename T>T Stack<T>:Pop()if(IsEmpty() throw popOnEmpty<T>(); /棧已空則不能退棧,拋出異常return elementstop-;/返回棧頂元素,同時(shí)棧頂指針退1template<typename T> void Stack<T>:StackFull()/堆棧加倍T * el=elements;int i=maxSize,j;maxSize*=2; /加倍??臻gif(maxSize<=32)elements=new T
16、 maxSize;/條件語(yǔ)句是為了演示分配不成功else elements=NULL;if(elements=NULL) throw stackfail<T>(); /分配不成功拋出異常for(j=0;j<i;j+) elementsj=elj;delete el;int main()int a20=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, b20=0,i;Stack<int>istack(4);for(i=0;i<20;i+)tryistack.Push(ai);/到a4,a8,a16時(shí)棧滿,異
17、常catch(pushOnFull<int>&eObj)eObj.print();tryistack.StackFull();catch(stackfail<int>&eObj)eObj.print();cin.get();return -1;istack.Push(eObj.value();istack.PrintStack();cout<<"數(shù)據(jù)出棧:"<<endl;tryfor(i=0;i<21;i+)bi=istack.Pop();cout<<bi<<'t'
18、cout<<endl;catch(popOnEmpty<int>&eObj) eObj.print();tryfor(i=0;i<41;i+)istack.Push(ai%20);cout<<ai%20<<'t'catch(pushOnFull<int>&eObj)eObj.print();tryistack.StackFull();catch(stackfail<int>&eObj)eObj.print();cin.get();return -1;istack.Push(eO
19、bj.value();return 0;10.4 在【例8.9】中,當(dāng)被積函數(shù)中出現(xiàn)被0除現(xiàn)象時(shí),應(yīng)拋出一個(gè)異常,但不退出主函數(shù),可進(jìn)行下一個(gè)定積分計(jì)算。解:利用C+標(biāo)準(zhǔn)庫(kù)的異常類結(jié)構(gòu)#include<iostream>#include<cmath>#include<stdexcept> /采用C+標(biāo)準(zhǔn)庫(kù)中的異常類#include<string>#include<iomanip>using namespace std;const double DefaultOverflow=1.0E10;class Simpsondouble Int
20、evalue,a,b; /Intevalue積分值,a積分下限,b積分上限public:virtual double fun(double x)=0; /被積函數(shù)聲明為純虛函數(shù)Simpson(double ra=0,double rb=0)a=ra;b=rb;Intevalue=0;void Integrate()double dx;int i;dx=(b-a)/2000;Intevalue=fun(a)+fun(b);for(i=1;i<2000;i+=2)Intevalue+=4*fun(a+dx*i);for(i=2;i<2000;i+=2)Intevalue+=2*fun(a+dx*i);Intevalue*=dx/3;void Print()cout<<"積分值="<<Intevalue<<endl;class A:public Simpsonpublic:A(double ra,double rb):Simpson
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2011規(guī)劃合同范例
- 假發(fā)購(gòu)銷合同范例
- 上海規(guī)劃設(shè)計(jì)合同范例
- 2025年低汽氣比CO高溫變換催化劑合作協(xié)議書
- 2023-2024學(xué)年湖北省崇陽(yáng)縣部分學(xué)校高一下學(xué)期開學(xué)考英語(yǔ)試題(解析版)
- 中考化學(xué)二輪復(fù)習(xí) 科學(xué)探究題特訓(xùn)專題3 實(shí)驗(yàn)方案設(shè)計(jì)及其評(píng)價(jià)(含解析)
- 工程建設(shè)年度借款合同
- 二零二五年度高新技術(shù)企業(yè)員工租房補(bǔ)貼合同范本
- 二零二五年度土地托管與農(nóng)村金融服務(wù)合作協(xié)議
- 二零二五年度影視劇本協(xié)議封皮圖片設(shè)計(jì)協(xié)議
- 2024-2025學(xué)年第二學(xué)期天域全國(guó)名校協(xié)作體高三3月聯(lián)考 地理試卷(含答案)
- 學(xué)校2025年每日兩小時(shí)體育活動(dòng)方案-陽(yáng)光體育活力四溢
- B超的基本知識(shí)
- 錘擊式PHC預(yù)應(yīng)力混凝土管樁貫入度的控制
- 2025年廣西旅發(fā)置業(yè)集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 敘事醫(yī)學(xué)培訓(xùn)課件
- 《勞動(dòng)紀(jì)律》課件
- 小學(xué)數(shù)學(xué)一年級(jí)上冊(cè)數(shù)與代數(shù)
- 失能老年人健康管理模式研究進(jìn)展
- 5G優(yōu)化案例:5G波束配置優(yōu)化提升CQI優(yōu)良比案例
評(píng)論
0/150
提交評(píng)論