面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)第十二章異常處理機(jī)制第一頁(yè),共二十九頁(yè),編輯于2023年,星期五

本章主要內(nèi)容:●異常處理的任務(wù)與思想●異常處理的實(shí)現(xiàn)●異常處理的應(yīng)用●異常處理中的構(gòu)造與析構(gòu)●C++標(biāo)準(zhǔn)異常類(lèi)第二頁(yè),共二十九頁(yè),編輯于2023年,星期五10.1異常處理的任務(wù)與思想●軟件不僅要保證能正確完成任務(wù),還應(yīng)當(dāng)具有良好的容錯(cuò)性?!袢蒎e(cuò)性是指軟件不僅在正確操作的條件下能正確運(yùn)行,而且當(dāng)環(huán)境異?;虿划?dāng)使用時(shí),依然能合理處理運(yùn)行過(guò)程中的出現(xiàn)的各種異常,而不會(huì)產(chǎn)生各種意想不到的后果。

●程序中的各種異常通過(guò)分析完全可以預(yù)料?!窀鶕?jù)異常的不同情況進(jìn)行對(duì)異常進(jìn)行處理,如給出提示信息、允許用戶(hù)排除環(huán)境錯(cuò)誤、繼續(xù)運(yùn)行程序等都是異常處理的基本任務(wù)。第三頁(yè),共二十九頁(yè),編輯于2023年,星期五1.傳統(tǒng)的異常處理方法●傳統(tǒng)程序設(shè)計(jì)方法中,通常采用系統(tǒng)提供的中斷函數(shù)或指令。

●當(dāng)被調(diào)用函數(shù)發(fā)生異?;虍a(chǎn)生錯(cuò)誤時(shí),返回一個(gè)特定的值,以便調(diào)用函數(shù)檢測(cè)錯(cuò)誤標(biāo)志,并作出處理;或當(dāng)錯(cuò)誤產(chǎn)生時(shí),釋放所有資源,結(jié)束程序運(yùn)行

第四頁(yè),共二十九頁(yè),編輯于2023年,星期五常用中斷函數(shù)或指令

函數(shù)原型/指令

功能

頭文件voidabort()中斷程序執(zhí)行,返回主C++窗口stdlib.hvoidassert(表達(dá)式)若表達(dá)式的值為false則中斷程序執(zhí)行,并顯示中斷所在的文件和所在行號(hào)assert.hvoidexit(狀態(tài))中斷程序執(zhí)行,返回退出代碼(狀態(tài)值)stdlib.hreturn表達(dá)式終止函數(shù)執(zhí)行,返回表達(dá)式的值

第五頁(yè),共二十九頁(yè),編輯于2023年,星期五#include<iostream.h>doublediv(double,double);voidmain(){ doublex,y; cout<<"Pleaseinputy="; cin>>y; cout<<"Pleaseinputx="; cin>>x; if(x==0) cout<<"Dividedbyzero,Error!"<<endl;else{cout<<"q="<<div(x,y)<<endl;}cout<<"Endoftheprogram."<<endl;}doublediv(doublex,doubley){returny/x;}傳統(tǒng)異常處理方法的優(yōu)點(diǎn)是異常處理直接,系統(tǒng)運(yùn)行開(kāi)銷(xiāo)少,適用于處理簡(jiǎn)單的局部錯(cuò)誤與異常。不足之處是異常處理代碼分布于程序中可能出錯(cuò)的各個(gè)地方,異常處理代碼與系統(tǒng)功能實(shí)現(xiàn)代碼混在一起,降低程序的可讀性與可維護(hù)性,不適合大型軟件的開(kāi)發(fā),也不符合現(xiàn)代軟件工程的理念第六頁(yè),共二十九頁(yè),編輯于2023年,星期五2.C++異常處理機(jī)制

●在大型軟件中,由于函數(shù)之間具有各自明確的分工并可能存在調(diào)用關(guān)系,發(fā)生錯(cuò)誤的函數(shù)可能不便于或不具備處理錯(cuò)誤的條件。

C++異常處理機(jī)制的基本思想是將異常檢測(cè)與異常處理分離。產(chǎn)生異常的函數(shù)不一定需要具備異常處理的能力,當(dāng)一個(gè)函數(shù)發(fā)生異常時(shí),它拋出所發(fā)生的異?;蝈e(cuò)誤,由調(diào)用者捕獲或處理異常,若上層調(diào)用函數(shù)仍不便于處理異常,還可以進(jìn)一步拋出異常,按調(diào)用層次關(guān)系傳遞給更上一層處理。第七頁(yè),共二十九頁(yè),編輯于2023年,星期五2.C++異常處理機(jī)制函數(shù)f()捕獲并處理異常函數(shù)h()引發(fā)異常函數(shù)g()……調(diào)用者異常傳播方向調(diào)用關(guān)系第八頁(yè),共二十九頁(yè),編輯于2023年,星期五10.2C++異常處理的實(shí)現(xiàn)●C++語(yǔ)言提供了對(duì)異常處理機(jī)制的內(nèi)部支持●由try、throw和catch語(yǔ)句提供了C++用于實(shí)現(xiàn)異常處理的機(jī)制?!裨诋惓L幚頇C(jī)制的支持下,可以更合理、更有效的處理程序運(yùn)行過(guò)程中存在的各種異?,F(xiàn)象。第九頁(yè),共二十九頁(yè),編輯于2023年,星期五1.異常處理的語(yǔ)法

●try-throw-catch是C++異常處理機(jī)制的實(shí)現(xiàn)語(yǔ)句;●程序中可能產(chǎn)生異常的部分應(yīng)包含于try塊之中;●異常由緊隨其后的catch語(yǔ)句捕獲和處理;●throw語(yǔ)句的作用是拋出異常。第十頁(yè),共二十九頁(yè),編輯于2023年,星期五異常處理程序的使用形式

try{

語(yǔ)句;

}catch(類(lèi)型1參數(shù)1){

與類(lèi)型1相關(guān)的異常處理語(yǔ)句;}catch(類(lèi)型2參數(shù)2){

與類(lèi)型2相關(guān)的異常處理語(yǔ)句;}┇catch(類(lèi)型n參數(shù)n){

與類(lèi)型n相關(guān)的異常處理語(yǔ)句;}throw表達(dá)式使用格式如下:throw表達(dá)式;第十一頁(yè),共二十九頁(yè),編輯于2023年,星期五●try語(yǔ)句塊實(shí)際上是程序代碼的保護(hù)段,表明該程序段在執(zhí)行過(guò)程中可能會(huì)產(chǎn)生異常或出現(xiàn)錯(cuò)誤;●若預(yù)料某段程序代碼或某個(gè)函數(shù)可能發(fā)生異?;蝈e(cuò)誤,就應(yīng)當(dāng)將之置于try語(yǔ)句塊之內(nèi);●一旦該代碼段或函數(shù)在調(diào)用過(guò)程中產(chǎn)生了異常情況,throw語(yǔ)句將拋出這個(gè)異常,并通過(guò)throw之后的表達(dá)式返回一個(gè)值;有關(guān)說(shuō)明第十二頁(yè),共二十九頁(yè),編輯于2023年,星期五●當(dāng)函數(shù)出現(xiàn)了自己不能處理的異常,就可以使用“throw表達(dá)式”將異常拋出;●throw之后的“表達(dá)式”表示異常類(lèi)型,它在語(yǔ)法上與return語(yǔ)句的“表達(dá)式”值類(lèi)似;●throw語(yǔ)句表達(dá)式的值不能用來(lái)區(qū)分不同異常,所以當(dāng)程序?qū)⒁獟伋龆鄠€(gè)異常,應(yīng)該用不同類(lèi)型的表達(dá)式值相互區(qū)別;

有關(guān)說(shuō)明(續(xù))第十三頁(yè),共二十九頁(yè),編輯于2023年,星期五●catch語(yǔ)句塊是異常處理的程序代碼,捕獲和處理由“throw表達(dá)式”所拋出的異常?!馽atch之后的異常類(lèi)型可以是任何有效的數(shù)據(jù)類(lèi)型,它與函數(shù)的形參類(lèi)似,既可以是int、float等某個(gè)類(lèi)型值,也可以是引用及C++的類(lèi),它用于指定catch語(yǔ)句塊所處理的異常的類(lèi)型;●當(dāng)異常被拋出后,catch塊依次被檢查,若某catch語(yǔ)句塊的異常類(lèi)型與被拋出的異常類(lèi)型一致,則執(zhí)行該異常處理程序段。有關(guān)說(shuō)明(續(xù))第十四頁(yè),共二十九頁(yè),編輯于2023年,星期五●在一個(gè)try語(yǔ)句塊內(nèi),異常處理程序?qū)凑账霈F(xiàn)的位置先后順序進(jìn)行檢查。若找到一個(gè)匹配的異常類(lèi)型,后面的異常處理都將被忽略;●如果異常類(lèi)型聲明是一個(gè)省略號(hào)(…),則表示catch語(yǔ)句可以處理任何類(lèi)型的異常;●類(lèi)型為省略號(hào)的catch處理程序必須是try塊的最后一段處理程序。

有關(guān)說(shuō)明(續(xù))第十五頁(yè),共二十九頁(yè),編輯于2023年,星期五doublediv(doublex,doubley){if(x==0) throwy;//若x=0時(shí),拋出異常returny/x;}#include<iostream.h>doublediv(double,double);voidmain(){doublex,y;try //try語(yǔ)句塊{ cout<<"Pleaseinputy="; cin>>y; cout<<"Pleaseinputx="; cin>>x; cout<<"q="<<div(x,y)<<endl;}catch(double) //捕獲異常{ cout<<"Dividedbyzero,Error!"<<endl;}cout<<"Endoftheprogram."<<endl;}第十六頁(yè),共二十九頁(yè),編輯于2023年,星期五異常處理的執(zhí)行過(guò)程

●通過(guò)正常的執(zhí)行順序直到try語(yǔ)句,然后執(zhí)行try塊內(nèi)的保護(hù)段?!袢舯Wo(hù)段在執(zhí)行期間沒(méi)有產(chǎn)生異常,則try語(yǔ)句塊后的catch塊不會(huì)被執(zhí)行,程序從最后一個(gè)catch語(yǔ)句塊后面的語(yǔ)句繼續(xù)執(zhí)行。

第十七頁(yè),共二十九頁(yè),編輯于2023年,星期五異常處理的執(zhí)行過(guò)程(續(xù))

●若保護(hù)段在執(zhí)行期間或保護(hù)段調(diào)用的任何函數(shù)中(直接或間接的調(diào)用)有異常拋出,則從通過(guò)throw操作數(shù)創(chuàng)建的對(duì)象中創(chuàng)建一個(gè)異常對(duì)象。然后尋找catch語(yǔ)句塊或一個(gè)能處理任何類(lèi)型異常的catch處理塊。catch語(yǔ)句塊按其出現(xiàn)的順序被檢查,如果沒(méi)有匹配的catch處理塊,則繼續(xù)檢查下一個(gè)動(dòng)態(tài)封閉的try塊,直到最外層的封閉try塊被檢查完。第十八頁(yè),共二十九頁(yè),編輯于2023年,星期五異常處理的執(zhí)行過(guò)程(續(xù))

●若沒(méi)有匹配的catch處理塊,則terminate函數(shù)將被自動(dòng)調(diào)用,而terminate函數(shù)的默認(rèn)功能是調(diào)用abort函數(shù)終止程序?!袢粲衅ヅ涞腸atch處理塊,如果它通過(guò)值進(jìn)行捕獲,則其形參通過(guò)復(fù)制異常對(duì)象進(jìn)行初始化。如果它通過(guò)引用進(jìn)行捕獲,則參量被初始化為指向異常對(duì)象。在形參被初始化之后,對(duì)那些在與catch處理器相對(duì)應(yīng)的try塊開(kāi)始和異常拋出點(diǎn)之間創(chuàng)建、但尚未析構(gòu)的所有自動(dòng)對(duì)象進(jìn)行析構(gòu),然后執(zhí)行catch處理程序。第十九頁(yè),共二十九頁(yè),編輯于2023年,星期五

多種異常的檢測(cè)。#include<iostream.h>doublejudgement(char*ptr,intag,doublesal);voidmain(){charname[20];doublesalary;intage;cout<<"Pleaseinputname:"<<endl;cin>>name;cout<<"Pleaseinputage:"<<endl;cin>>age;cout<<"Pleaseinputsalary:"<<endl;cin>>salary;if(judgement(name,age,salary)){cout<<"name="<<name<<endl;cout<<"age="<<age<<endl;cout<<"salary="<<salary<<endl;}cout<<"Endoftheprogram."<<endl;}doublejudgement(char*ptr,intag,doublesal){boollogic;logic=true;try{if(a<16)throwag;if(s<530)throwsal;}catch(intag){logic=false;cout<<"職工年齡小于16歲,違反勞動(dòng)法!"<<ag<<endl;}catch(doublesal){logic=false;cout<<"工資低于本市最低工資530元,違反勞動(dòng)!"<<sal<<endl;}returnlogic;}第二十頁(yè),共二十九頁(yè),編輯于2023年,星期五●

C++程序設(shè)計(jì)中經(jīng)常發(fā)生函數(shù)調(diào)用,在調(diào)用函數(shù)時(shí)除需要了解函數(shù)參數(shù)值和返回值類(lèi)型之外,當(dāng)函數(shù)有異常拋出時(shí),還需要知道函數(shù)拋出異常的方式,以方便調(diào)用函數(shù)(主調(diào)函數(shù))對(duì)異常進(jìn)行處理.函數(shù)異常接口的聲明進(jìn)一步提高了程序的可讀性?!癞惓5膾伋?、捕獲與處理已經(jīng)成為函數(shù)接口的一部分,因此,在函數(shù)原型中需要指定函數(shù)可以?huà)伋龅漠惓n?lèi)型。2.異常處理接口

第二十一頁(yè),共二十九頁(yè),編輯于2023年,星期五指定異常類(lèi)型類(lèi)型函數(shù)名(參數(shù)表)throw(A1,A2,…,An);

函數(shù)原型聲明表明可以?huà)伋龅漠惓n?lèi)型為A1,A2,…,An及這些類(lèi)型的子類(lèi)型異常。指定函數(shù)所拋出的異常的形式:第二十二頁(yè),共二十九頁(yè),編輯于2023年,星期五指定函數(shù)所拋出的異常的形式(續(xù))

2.拋出任意類(lèi)型異常類(lèi)型函數(shù)名(參數(shù)表);

函數(shù)原型沒(méi)有throw的說(shuō)明,該函數(shù)可以?huà)伋鋈我忸?lèi)型的異常。第二十三頁(yè),共二十九頁(yè),編輯于2023年,星期五指定函數(shù)所拋出的異常的形式(續(xù))3.不拋出異常類(lèi)型函數(shù)名(參數(shù)表)throw();throw之后是一個(gè)空表,該函數(shù)原型聲明表示該函數(shù)不拋出任何類(lèi)型的異常。第二十四頁(yè),共二十九頁(yè),編輯于2023年,星期五C++異常處理機(jī)制不僅能處理各種不同類(lèi)型的異常,而且能處理構(gòu)造函數(shù)異常,即具有為拋出異常前構(gòu)造的所有局部對(duì)象自動(dòng)調(diào)用析構(gòu)函數(shù)的能力。3.異常處理中的構(gòu)造與析構(gòu)第二十五頁(yè),共二十九頁(yè),編輯于2023年,星期五#include<iostream.h>voidTestFun();classTestA{public:TestA(){cout<<"ConstructingTestA..."<<endl;};~TestA(){cout<<"DestructingTestA"<<endl;};voidDisplay(){cout<<"ClassTestAException!"<<endl;}};classTestB{public:TestB();~TestB();};TestB::TestB(){cout<<"ConstructingTestB"<<endl;}TestB::~TestB(){cout<<"DestructingTestB"<<endl;}voidTestFun(){TestBtb;cout<<"ThrowTestAException!"<<endl;throwTestA();}voidmain(){cout<<"NowEntermain()"<<endl;try{cout<<"NowCallTestFun()"<<endl;TestFun();}catch(TestAta){cout<<"AnTestAExceptionOccurred!"<<endl;ta.Display();}catch(...){cout<<"OtherExceptionOccurred!"<<endl;}cout<<"Returnmain()"<<endl;}第二十六頁(yè),共二十九頁(yè),編輯于2023年,星

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論