![c++中的異常處理_第1頁(yè)](http://file4.renrendoc.com/view/d2d9ce6f54bdff27b246971a713e1410/d2d9ce6f54bdff27b246971a713e14101.gif)
![c++中的異常處理_第2頁(yè)](http://file4.renrendoc.com/view/d2d9ce6f54bdff27b246971a713e1410/d2d9ce6f54bdff27b246971a713e14102.gif)
![c++中的異常處理_第3頁(yè)](http://file4.renrendoc.com/view/d2d9ce6f54bdff27b246971a713e1410/d2d9ce6f54bdff27b246971a713e14103.gif)
![c++中的異常處理_第4頁(yè)](http://file4.renrendoc.com/view/d2d9ce6f54bdff27b246971a713e1410/d2d9ce6f54bdff27b246971a713e14104.gif)
![c++中的異常處理_第5頁(yè)](http://file4.renrendoc.com/view/d2d9ce6f54bdff27b246971a713e1410/d2d9ce6f54bdff27b246971a713e14105.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第11章異常處理18.1.1異常處理的任務(wù)程序編制者不僅要考慮程序沒(méi)有錯(cuò)誤的理想情況,更要考慮程序存在錯(cuò)誤時(shí)的情況,應(yīng)該能夠盡快地發(fā)現(xiàn)錯(cuò)誤,消除錯(cuò)誤。11.1異常處理2程序中常見(jiàn)的錯(cuò)誤有兩大類:語(yǔ)法錯(cuò)誤和運(yùn)行錯(cuò)誤。在編譯時(shí),編譯系統(tǒng)能發(fā)現(xiàn)程序中的語(yǔ)法錯(cuò)誤。有的程序雖然能通過(guò)編譯,也能投入運(yùn)行。但是在運(yùn)行過(guò)程中會(huì)出現(xiàn)異常,得不到正確的運(yùn)行結(jié)果,甚至導(dǎo)致程序不正常終止,或出現(xiàn)死機(jī)現(xiàn)象。這類錯(cuò)誤比較隱蔽,不易被發(fā)現(xiàn),往往耗費(fèi)許多時(shí)間和精力。這成為程序調(diào)試中的一個(gè)難點(diǎn)。3在設(shè)計(jì)程序時(shí),應(yīng)當(dāng)事先分析程序運(yùn)行時(shí)可能出現(xiàn)的各種意外的情況,并且分別制訂出相應(yīng)的處理方法,這就是程序的異常處理的任務(wù)。若無(wú)異常處理,如果運(yùn)行時(shí)出現(xiàn)異常,程序只能終止運(yùn)行。如果在程序中設(shè)置了異常處理機(jī)制,則在運(yùn)行情況出現(xiàn)異常時(shí),由于程序本身已規(guī)定了處理的方法,于是程序的流程就轉(zhuǎn)到異常處理代碼段處理。4C++采取的辦法是:如果在執(zhí)行一個(gè)函數(shù)過(guò)程中出現(xiàn)異常,可以不在本函數(shù)中立即處理,而是發(fā)出一個(gè)信息,傳給它的上一級(jí)(即調(diào)用它的函數(shù)),它的上級(jí)捕捉到這個(gè)信息后進(jìn)行處理。如果上一級(jí)的函數(shù)也不能處理,就再傳給其上一級(jí),由其上一級(jí)處理。如此逐級(jí)上送,如果到最高一級(jí)還無(wú)法處理,最后只好異常終止程序的執(zhí)行。11.1.2異常處理的方法5這樣做使異常的發(fā)現(xiàn)與處理不由同一函數(shù)來(lái)完成。好處是使底層的函數(shù)專門用于解決實(shí)際任務(wù),而不必再承擔(dān)處理異常的任務(wù),以減輕底層函數(shù)的負(fù)擔(dān),而把處理異常的任務(wù)上移到某一層去處理。這樣可以提高效率。C++處理異常的機(jī)制是由3個(gè)部分組成的,即檢查(try)、拋出(throw)和捕捉(catch)。把需要檢查的語(yǔ)句放在try塊中,throw用來(lái)當(dāng)出現(xiàn)異常時(shí)發(fā)出一個(gè)異常信息,而catch則用來(lái)捕捉異常信息,如果捕捉到了異常信息,就處理它。6例11.1給出三角形的三邊a,b,c,求三角形的面積。只有a+b>c,b+c>a,c+a>b時(shí)才能構(gòu)成三角形。設(shè)置異常處理,對(duì)不符合三角形條件的輸出警告信息,不予計(jì)算。先寫出沒(méi)有異常處理時(shí)的程序:#include<iostream>#include<cmath>usingnamespacestd;intmain(){doubletriangle(double,double,double);doublea,b,c;
cin>>a>>b>>c;while(a>0&&b>0&&c>0){cout<<triangle(a,b,c)<<endl;
cin>>a>>b>>c;}return0;7}doubletriangle(doublea,doubleb,doublec){doublearea;doubles=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));returnarea;}運(yùn)行情況如下:654↙(輸入a,b,c的值)9.92157(輸出三角形的面積)11.52↙(輸入a,b,c的值)0.726184(輸出三角形的面積)121↙(輸入a,b,c的值)0(輸出三角形的面積,此結(jié)果顯然不對(duì),因?yàn)椴皇侨切?106↙(輸入a,b,c的值)(結(jié)束)8修改程序,在函數(shù)traingle中對(duì)三角形條件進(jìn)行檢查,如果不符合三角形條件,就拋出一個(gè)異常信息,在主函數(shù)中的try-catch塊中調(diào)用traingle函數(shù),檢測(cè)有無(wú)異常信息,并作相應(yīng)處理。修改后的程序如下:#include<iostream>#include<cmath>usingnamespacestd;voidmain(){doubletriangle(double,double,double);doublea,b,c;
cin>>a>>b>>c;try//在try塊中包含要檢查的函數(shù){while(a>0&&b>0&&c>0){cout<<triangle(a,b,c)<<endl;
cin>>a>>b>>c;}}9catch(double)//用catch捕捉異常信息并作相應(yīng)處理{cout<<″a=″<<a<<″,b=″<<b<<″,c=″<<c<<″,thatisnotatriangle!″<<endl;}
cout<<″e(cuò)nd″<<endl;}doubletriangle(doublea,doubleb,doublec)//計(jì)算三角形的面積的函數(shù){doubles=(a+b+c)/2;if(a+b<=c||b+c<=a||c+a<=b)throwa;//當(dāng)不符合三角形條件拋出異常信息
returnsqrt(s*(s-a)*(s-b)*(s-c));}10程序運(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!(異常處理)end11現(xiàn)在結(jié)合程序分析怎樣進(jìn)行異常處理。(1)首先把可能出現(xiàn)異常的、需要檢查的語(yǔ)句或程序段放在try后面的花括號(hào)中。(2)程序開(kāi)始運(yùn)行后,按正常的順序執(zhí)行到try塊,開(kāi)始執(zhí)行try塊中花括號(hào)內(nèi)的語(yǔ)句。如果在執(zhí)行try塊內(nèi)的語(yǔ)句過(guò)程中沒(méi)有發(fā)生異常,則catch子句不起作用,流程轉(zhuǎn)到catch子句后面的語(yǔ)句繼續(xù)執(zhí)行。(3)如果在執(zhí)行try塊內(nèi)的語(yǔ)句(包括其所調(diào)用的函數(shù))過(guò)程中發(fā)生異常,則throw運(yùn)算符拋出一個(gè)異常信息。throw拋出異常信息后,流程立即離開(kāi)本函數(shù),轉(zhuǎn)到其上一級(jí)的函數(shù)(main函數(shù))。throw拋出什么樣的數(shù)據(jù)由程序設(shè)計(jì)者自定,可以是任何類型的數(shù)據(jù)。12(4)這個(gè)異常信息提供給try-catch結(jié)構(gòu),系統(tǒng)會(huì)尋找與之匹配的catch子句。(5)在進(jìn)行異常處理后,程序并不會(huì)自動(dòng)終止,繼續(xù)執(zhí)行catch子句后面的語(yǔ)句。由于catch子句是用來(lái)處理異常信息的,往往被稱為catch異常處理塊或catch異常處理器。13下面講述異常處理的語(yǔ)法。throw語(yǔ)句一般是由throw運(yùn)算符和一個(gè)數(shù)據(jù)組成的,其形式為throw表達(dá)式;try-catch的結(jié)構(gòu)為try{被檢查的語(yǔ)句}catch(異常信息類型[變量名]){進(jìn)行異常處理的語(yǔ)句}14說(shuō)明:(1)被檢測(cè)的函數(shù)必須放在try塊中,否則不起作用。(2)try塊和catch塊作為一個(gè)整體出現(xiàn),catch塊是try-catch結(jié)構(gòu)中的一部分,必須緊跟在try塊之后,不能單獨(dú)使用,在二者之間也不能插入其他語(yǔ)句。但是在一個(gè)try-catch結(jié)構(gòu)中,可以只有try塊而無(wú)catch塊。即在本函數(shù)中只檢查而不處理,把catch處理塊放在其他函數(shù)中。(3)try和catch塊中必須有用花括號(hào)括起來(lái)的復(fù)合語(yǔ)句,即使花括號(hào)內(nèi)只有一個(gè)語(yǔ)句,也不能省略花括號(hào)。(4)一個(gè)try-catch結(jié)構(gòu)中只能有一個(gè)try塊,但卻可以有多個(gè)catch塊,以便與不同的異常信息匹配。15(5)catch后面的圓括號(hào)中,一般只寫異常信息的類型名,如catch(double)catch只檢查所捕獲異常信息的類型,而不檢查它們的值。因此如果需要檢測(cè)多個(gè)不同的異常信息,應(yīng)當(dāng)由throw拋出不同類型的異常信息。異常信息可以是C++系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)類型,也可以是用戶自定義的類型(如結(jié)構(gòu)體或類)。如果由throw拋出的信息屬于該類型或其子類型,則catch與throw二者匹配,catch捕獲該異常信息。catch還可以有另外一種寫法,即除了指定類型名外,還指定變量名,如catch(doubled)16此時(shí)如果throw拋出的異常信息是double型的變量a,則catch在捕獲異常信息a的同時(shí),還使d獲得a的值,或者說(shuō)d得到a的一個(gè)拷貝。什么時(shí)候需要這樣做呢?有時(shí)希望在捕獲異常信息時(shí),還能利用throw拋出的值,如catch(doubled){cout<<″throw″<<d;}這時(shí)會(huì)輸出d的值(也就是a值)。當(dāng)拋出的是類對(duì)象時(shí),有時(shí)希望在catch塊中顯示該對(duì)象中的某些信息。這時(shí)就需要在catch的參數(shù)中寫出變量名(類對(duì)象名)。(6)如果在catch子句中沒(méi)有指定異常信息的類型,而用了刪節(jié)號(hào)“…”,則表示它可以捕捉任何類型的異常信息,如17catch(…){cout<<″OK″<<endl;}它能捕捉所有類型的異常信息,并輸出″OK″。這種catch子句應(yīng)放在trycatch結(jié)構(gòu)中的最后,相當(dāng)于“其他”。如果把它作為第一個(gè)catch子句,則后面的catch子句都不起作用。(7)try_catch結(jié)構(gòu)可以與throw出現(xiàn)在同一個(gè)函數(shù)中,也可以不在同一函數(shù)中。當(dāng)throw拋出異常信息后,首先在本函數(shù)中尋找與之匹配的catch,如果在本函數(shù)中無(wú)try_catch結(jié)構(gòu)或找不到與之匹配的catch,就轉(zhuǎn)到離開(kāi)出現(xiàn)異常最近的try_catch結(jié)構(gòu)去處理。18(8)在某些情況下,在throw語(yǔ)句中可以不包括表達(dá)式,如throw;表示“我不處理這個(gè)異常,請(qǐng)上級(jí)處理”。(9)如果throw拋出的異常信息找不到與之匹配的catch塊,那么系統(tǒng)就會(huì)調(diào)用一個(gè)系統(tǒng)函數(shù)terminate,使程序終止運(yùn)行。19C++允許在聲明函數(shù)時(shí)列出可能拋出的異常類型,如可以將例11.1中第二個(gè)程序的第3行改寫為doubletriangle(double,double,double)throw(double);表示triangle函數(shù)只能拋出double類型的異常信息。如果寫成doubletriangle(double,double,double)throw(int,double,float,char);則表示triangle函數(shù)可以拋出int,double,float或char類型的異常信息。異常指定是函數(shù)聲明的一部分,必須同時(shí)出現(xiàn)在函數(shù)聲明和函數(shù)定義的首行中,否則在進(jìn)行函數(shù)的另一次聲明時(shí),編譯系統(tǒng)會(huì)報(bào)告“類型不匹配”。11.1.3在函數(shù)聲明中進(jìn)行異常情況指定20如果在聲明函數(shù)時(shí)未列出可能拋出的異常類型,則該函數(shù)可以拋出任何類型的異常信息。如例11.1中第2個(gè)程序中所表示的那樣。如果想聲明一個(gè)不能拋出異常的函數(shù),可以寫成以下形式:doubletriangle(double,double,double)throw();//throw無(wú)參數(shù)這時(shí)即使在函數(shù)執(zhí)行過(guò)程中出現(xiàn)了throw語(yǔ)句,實(shí)際上也并不執(zhí)行throw語(yǔ)句,并不拋出任何異常信息,程序?qū)⒎钦=K止。21如果在try塊(或try塊中調(diào)用的函數(shù))中定義了類對(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)(調(diào)用類對(duì)象的析構(gòu)函數(shù)),析構(gòu)對(duì)象的順序與構(gòu)造的順序相反,然后執(zhí)行與異常信息匹配的catch塊中的語(yǔ)句。11.1.4在異常處理中處理析構(gòu)函數(shù)22例11.3在異常處理中處理析構(gòu)函數(shù)。這是一個(gè)為說(shuō)明在異常處理中調(diào)用析構(gòu)函數(shù)的示例,為了清晰地表示流程,程序中加入了一些cout語(yǔ)句,輸出有關(guān)的信息,以便對(duì)照結(jié)果分析程序。#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;};23voidStudent::get_data()//定義成員函數(shù){if(num==0)thrownum;//如num=0,拋出int型變量numelsecout<<num<<″″<<name<<endl;//若num≠0,輸出num,name
cout<<″inget_data()″<<endl;//輸出信息,表示目前在get_data函數(shù)中}voidfun(){Studentstud1(1101,″Tan″);//建立對(duì)象stud1stud1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 杭州浙江杭州拱墅區(qū)大關(guān)上塘街道社區(qū)衛(wèi)生服務(wù)中心招聘編外聘用人員筆試歷年參考題庫(kù)附帶答案詳解
- 2025年中國(guó)不銹鋼絲清潔球市場(chǎng)調(diào)查研究報(bào)告
- 2025至2031年中國(guó)鍍鎳快速填平劑行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年聚丙烯塑編布項(xiàng)目可行性研究報(bào)告
- 2025年著色均勻機(jī)項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)球形水箱行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年模擬型霍爾傳感器項(xiàng)目可行性研究報(bào)告
- 2025年無(wú)刷同步發(fā)電機(jī)項(xiàng)目可行性研究報(bào)告
- 2025至2031年中國(guó)安全知識(shí)考試系統(tǒng)行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年固定式排球柱項(xiàng)目可行性研究報(bào)告
- 2025年全國(guó)科技活動(dòng)周科普知識(shí)競(jìng)賽試題庫(kù)及答案
- 2024年全國(guó)中學(xué)生生物學(xué)聯(lián)賽試題及答案詳解
- 工廠生產(chǎn)區(qū)清潔流程及安全規(guī)范
- 化學(xué)丨百師聯(lián)盟2025屆高三1月一輪復(fù)習(xí)聯(lián)考(五)化學(xué)試卷及答案
- 2024年全國(guó)職業(yè)院校技能大賽中職(酒店服務(wù)賽項(xiàng))備賽試題庫(kù)(500題)
- 工程建設(shè)項(xiàng)目培訓(xùn)
- 2025年1月浙江省高考英語(yǔ)試卷真題(含答案)
- 青海省西寧市市級(jí)名校2025屆中考生物全真模擬試題含解析
- 鐵路路基工程施工組織設(shè)計(jì)方案
- 小學(xué)班會(huì)-交通安全伴我行(共25張課件)
- 2025年日歷(日程安排-可直接打印)
評(píng)論
0/150
提交評(píng)論