第12章+異常處理_第1頁(yè)
第12章+異常處理_第2頁(yè)
第12章+異常處理_第3頁(yè)
第12章+異常處理_第4頁(yè)
第12章+異常處理_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)本章主要內(nèi)容本章主要內(nèi)容l異常處理的基本思想異常處理的基本思想lC+異常處理的實(shí)現(xiàn)異常處理的實(shí)現(xiàn)拋出異常拋出異常throwthrow捕獲異常捕獲異常try,catchtry,catchl異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu)l異常規(guī)格說明異常規(guī)格說明面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)什么是異常?什么是異常?l應(yīng)用程序要具有容錯(cuò)能力,當(dāng)發(fā)生意外時(shí)也可作應(yīng)用程序要具有容錯(cuò)能力,當(dāng)發(fā)生意外時(shí)也可作出適當(dāng)處理,不會(huì)導(dǎo)致嚴(yán)重后果。所謂出適當(dāng)處理,不會(huì)導(dǎo)致嚴(yán)重后果。所謂異常,包異常,包括用戶誤操作、外部設(shè)備或文件連接不正確、內(nèi)括用戶誤操作、外部設(shè)備或

2、文件連接不正確、內(nèi)存不足等存不足等。l傳統(tǒng)的處理方法是使用中斷指令,如傳統(tǒng)的處理方法是使用中斷指令,如abort, assert, abort, assert, exit, return, exit, return, 錯(cuò)誤處理代碼摻雜于功能實(shí)現(xiàn)代碼,錯(cuò)誤處理代碼摻雜于功能實(shí)現(xiàn)代碼,降低了程序的可讀性和可維護(hù)性,降低了程序的可讀性和可維護(hù)性, 而且不適合于而且不適合于代碼重用。代碼重用。lc+c+的異常處理允許程序以的異常處理允許程序以結(jié)構(gòu)化和順序化結(jié)構(gòu)化和順序化的方的方式處理反常和意外的情況。式處理反常和意外的情況。面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)l將將異常檢測(cè)與處理分離異常檢測(cè)與處理分離,出現(xiàn)異

3、常的函數(shù)不,出現(xiàn)異常的函數(shù)不需具備處理異常的能力。需具備處理異常的能力。l當(dāng)一個(gè)函數(shù)發(fā)生異常時(shí),它拋出一個(gè)異常,當(dāng)一個(gè)函數(shù)發(fā)生異常時(shí),它拋出一個(gè)異常,調(diào)用者捕獲并處理該異常。若調(diào)用者不能處調(diào)用者捕獲并處理該異常。若調(diào)用者不能處理,還可拋出給上一級(jí)調(diào)用者處理,直至運(yùn)理,還可拋出給上一級(jí)調(diào)用者處理,直至運(yùn)行系統(tǒng)。若仍不能處理,將簡(jiǎn)單終止程序。行系統(tǒng)。若仍不能處理,將簡(jiǎn)單終止程序。異常處理的基本思想異常處理的基本思想面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)異常處理的基本思想異常處理的基本思想函數(shù)函數(shù)f( )f( )捕獲并處理異常捕獲并處理異常函數(shù)函數(shù)h( ) h( ) 引發(fā)異常引發(fā)異常函數(shù)函數(shù)g( )g( )調(diào)

4、用者調(diào)用者異常傳播方向異常傳播方向調(diào)用關(guān)系調(diào)用關(guān)系面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)異常處理的實(shí)現(xiàn)機(jī)制異常處理的實(shí)現(xiàn)機(jī)制l拋擲異常的程序段拋擲異常的程序段.throw throw 表達(dá)式表達(dá)式; ;.l捕獲并處理異常的程序段捕獲并處理異常的程序段trytry 復(fù)合語(yǔ)句復(fù)合語(yǔ)句catchcatch(異常類型聲明)(異常類型聲明) 復(fù)合語(yǔ)句復(fù)合語(yǔ)句catchcatch(異常類型聲明)(異常類型聲明) 復(fù)合語(yǔ)句復(fù)合語(yǔ)句 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)l若有異常則通過若有異常則通過throwthrow操作操作創(chuàng)建一個(gè)異常對(duì)象并拋擲。創(chuàng)建一個(gè)異常對(duì)象并拋擲。l將可能拋出異常的程序段嵌在將可能拋出異常的程序段嵌在

5、trytry塊塊中??刂仆ㄟ^正常的中??刂仆ㄟ^正常的順序執(zhí)行到達(dá)順序執(zhí)行到達(dá)trytry語(yǔ)句,然后執(zhí)行語(yǔ)句,然后執(zhí)行trytry塊內(nèi)的保護(hù)段。塊內(nèi)的保護(hù)段。l如果在保護(hù)段執(zhí)行期間沒有引起異常,那么跟在如果在保護(hù)段執(zhí)行期間沒有引起異常,那么跟在trytry塊后塊后的的catchcatch子句就不執(zhí)行。程序從子句就不執(zhí)行。程序從trytry塊后跟隨的最后一個(gè)塊后跟隨的最后一個(gè)catchcatch子句后面的語(yǔ)句繼續(xù)執(zhí)行下去。子句后面的語(yǔ)句繼續(xù)執(zhí)行下去。lcatchcatch子句按其在子句按其在trytry塊后塊后出現(xiàn)的順序出現(xiàn)的順序被檢查。匹配的被檢查。匹配的catchcatch子句將捕獲并處理異常

6、(或繼續(xù)拋擲異常)子句將捕獲并處理異常(或繼續(xù)拋擲異常)。lcatch()catch()可以捕獲任何異??梢圆东@任何異常,所以建議,所以建議放在放在catchcatch子句的子句的最后最后。l如果匹配的處理器未找到,則如果匹配的處理器未找到,則運(yùn)行函數(shù)運(yùn)行函數(shù)terminateterminate將被自將被自動(dòng)調(diào)用,其動(dòng)調(diào)用,其缺省功能是調(diào)用缺省功能是調(diào)用abortabort終止程序終止程序。異常處理的實(shí)現(xiàn)機(jī)制異常處理的實(shí)現(xiàn)機(jī)制面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)異常處理語(yǔ)法(拋出異常)異常處理語(yǔ)法(拋出異常)ltry 塊塊 try / 需保護(hù)的需保護(hù)的測(cè)試塊測(cè)試塊 lthrow語(yǔ)句語(yǔ)句 throw 表

7、達(dá)式;表達(dá)式; / 表達(dá)式可以是任意類型的對(duì)象表達(dá)式可以是任意類型的對(duì)象 / throw語(yǔ)句必須在語(yǔ)句必須在try塊、塊、catch塊或其調(diào)用的函數(shù)中執(zhí)行塊或其調(diào)用的函數(shù)中執(zhí)行面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)lcatch塊塊 catch ( 類型類型 參數(shù)參數(shù)) /類型為基本數(shù)據(jù)類型或類類型類型為基本數(shù)據(jù)類型或類類型 / 異常處理語(yǔ)句塊異常處理語(yǔ)句塊 catch( ) / 可捕獲處理任意類型的異??刹东@處理任意類型的異常 / 異常處理語(yǔ)句塊異常處理語(yǔ)句塊 異常處理語(yǔ)法(捕獲異常)異常處理語(yǔ)法(捕獲異常)面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)例例1 處理除零異常處理除零異常#include int Div(

8、int x, int y);int main( ) try cout 5/2 = Div(5,2) endl; cout 8/0 = Div(8,0) endl; cout 7/1 = Div(7,1) endl; catch( int ) cout except of deviding zero.n; cout that is ok.n;int Div( int x, int y ) if(y = 0) throw y; return x / y;程序運(yùn)行結(jié)果如下:程序運(yùn)行結(jié)果如下:5/2 = 2except of deviding zero.that is ok.面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述

9、)異常的重新拋出異常的重新拋出l如果異常處理程序捕獲到異常后,無法確定異常的如果異常處理程序捕獲到異常后,無法確定異常的處理方式,須再拋出傳遞。這些工作通過加入不帶處理方式,須再拋出傳遞。這些工作通過加入不帶參數(shù)的參數(shù)的throwthrow就可完成:就可完成: catch( catch( . . . . . ) ) cout an exception was thrown endl; cout an exception was thrown endl; throw;throw; 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)在構(gòu)造函數(shù)中拋出異常在構(gòu)造函數(shù)中拋出異常l由于由于C C的構(gòu)造函數(shù)沒有返回值,適合用異的

10、構(gòu)造函數(shù)沒有返回值,適合用異常機(jī)制解決創(chuàng)建對(duì)象失敗問題。常機(jī)制解決創(chuàng)建對(duì)象失敗問題。l當(dāng)創(chuàng)建對(duì)象失敗,在構(gòu)造函數(shù)中拋出一個(gè)異常,當(dāng)創(chuàng)建對(duì)象失敗,在構(gòu)造函數(shù)中拋出一個(gè)異常,由創(chuàng)建對(duì)象的函數(shù)捕獲并處理異常。由創(chuàng)建對(duì)象的函數(shù)捕獲并處理異常。 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)在構(gòu)造函數(shù)中拋出異常(續(xù))在構(gòu)造函數(shù)中拋出異常(續(xù))l如果構(gòu)造函數(shù)在運(yùn)行時(shí)有異常拋出,析構(gòu)函數(shù)將無如果構(gòu)造函數(shù)在運(yùn)行時(shí)有異常拋出,析構(gòu)函數(shù)將無法收回這些存儲(chǔ)資源。這些問題大多數(shù)發(fā)生在未加法收回這些存儲(chǔ)資源。這些問題大多數(shù)發(fā)生在未加保護(hù)的指針上。例如:保護(hù)的指針上。例如:(上機(jī)驗(yàn)證)(上機(jī)驗(yàn)證) #include ofstream ou

11、t (“nudep.out”); class bonk public: bonk( ) out “bonk()” endl; bonk( ) out “bonk()” endl; ;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)class og public: void* operator new( size_t sz ) out “allocating an og” endl; throw int(47); return 0; void operator delete( void* p ) out “deleteing an og” endl; :delete p; ;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)class

12、useResources bonk* bp; og* op;public: useResources( int count = 1 ) out “useResources( )” endl; bp = new bonkcount; op = new og; useResource( ) out “useResources( )” endl;delete bp; delete op; ;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)int main( ) try useResources ur(3); catch (int) out inside handler endl; 輸出結(jié)果是: useResources

13、 ( ) bonk( ) bonk( ) bonk( ) allocating an og inside handler面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu)l找到一個(gè)匹配的找到一個(gè)匹配的catchcatch異常處理后:異常處理后:初始化參數(shù)。初始化參數(shù)。將從對(duì)應(yīng)的將從對(duì)應(yīng)的trytry塊開始到異常被拋擲塊開始到異常被拋擲處之間處之間構(gòu)造(且尚未析構(gòu))構(gòu)造(且尚未析構(gòu))的,所的,所有自動(dòng)對(duì)象進(jìn)行析構(gòu)。有自動(dòng)對(duì)象進(jìn)行析構(gòu)。從最后一個(gè)從最后一個(gè)catchcatch處理之后開始恢復(fù)處理之后開始恢復(fù)執(zhí)行執(zhí)行。面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)例例2 異常處理時(shí)的析構(gòu)異常處理

14、時(shí)的析構(gòu)(重點(diǎn)掌握)(重點(diǎn)掌握)#include void MyFunc( void );class Expt / /自編的異常處理類自編的異常處理類public: Expt( ) ; Expt( ) ; const char* ShowReason( ) const return Expt類異常。類異常。; ;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)class Demo public: Demo( ); Demo( );Demo:Demo( ) cout 構(gòu)造構(gòu)造 Demo。 endl;Demo:Demo( ) cout 析構(gòu)析構(gòu) Demo。 endl;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)void MyFunc

15、( ) Demo D; cout 在在MyFunc( )中拋擲中拋擲Expt類異常。類異常。 endl; throw Expt( ); / /構(gòu)建異常對(duì)象,并拋出構(gòu)建異常對(duì)象,并拋出int main( ) cout 在在main函數(shù)中。函數(shù)中。 endl; try cout 在在try塊中,調(diào)用塊中,調(diào)用MyFunc( )。 endl; MyFunc( ); 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述) catch( Expt E ) cout 在在catch異常處理程序中。異常處理程序中。 endl; cout 捕獲到捕獲到Expt類型異常:類型異常:; cout E.ShowReason( ) endl;

16、 catch( char *str ) cout 捕獲到其它的異常:捕獲到其它的異常: str endl; cout 回到回到main函數(shù)。從這里恢復(fù)執(zhí)行。函數(shù)。從這里恢復(fù)執(zhí)行。 endl;面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)程序運(yùn)行時(shí)輸出程序運(yùn)行時(shí)輸出:在在main函數(shù)中。函數(shù)中。在在try塊中,調(diào)用塊中,調(diào)用MyFunc( )。構(gòu)造構(gòu)造 Demo.在在MyFunc( )中拋擲中拋擲Expt類異常。類異常。析構(gòu)析構(gòu) Demo。在在catch異常處理程序中。異常處理程序中。捕獲到捕獲到Expt類型異常:類型異常:Expt類異常。類異常?;氐交氐絤ain函數(shù)。從這里恢復(fù)執(zhí)行。函數(shù)。從這里恢復(fù)執(zhí)行。面向?qū)?/p>

17、象程序設(shè)計(jì)(C+描述)lC + +C + +語(yǔ)言提供了異常規(guī)格說明語(yǔ)法,我們可以利用它語(yǔ)言提供了異常規(guī)格說明語(yǔ)法,我們可以利用它清晰地告訴使用者函數(shù)拋出的異常的類型,這樣使用者清晰地告訴使用者函數(shù)拋出的異常的類型,這樣使用者就可方便地進(jìn)行異常處理。這就是異常規(guī)格說明,它存就可方便地進(jìn)行異常處理。這就是異常規(guī)格說明,它存在于函數(shù)說明中,位于參數(shù)列表之后。在于函數(shù)說明中,位于參數(shù)列表之后。l異常規(guī)格說明的三種形式:異常規(guī)格說明的三種形式: (1 1)指定異常)指定異常,如:,如: void f ( ) throw( toobig, toosmall, divzerovoid f ( ) throw

18、( toobig, toosmall, divzero) ); 函數(shù)函數(shù)f( )f( )可拋出類型為可拋出類型為toobig, toosmall, divzerotoobig, toosmall, divzero的異常,的異常,若函數(shù)體內(nèi)拋出其它異常,調(diào)用函數(shù)無法捕獲,系統(tǒng)將若函數(shù)體內(nèi)拋出其它異常,調(diào)用函數(shù)無法捕獲,系統(tǒng)將調(diào)用調(diào)用abortabort函數(shù)終止程序。函數(shù)終止程序。異常接口聲明異常接口聲明面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)(2)不拋出異常)不拋出異常,如:,如: void f ( ) throw ( ); / 函數(shù)函數(shù)f()不拋出任何類型的異常()不拋出任何類型的異常(3)拋出任意類型的

19、異常)拋出任意類型的異常,如:,如: void f ( );異常接口聲明異常接口聲明面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)本節(jié)課主要介紹了如下內(nèi)容:本節(jié)課主要介紹了如下內(nèi)容: 1 異常處理的基本思想異常處理的基本思想 2 C+異常處理的實(shí)現(xiàn)異常處理的實(shí)現(xiàn) 3 異常處理中的構(gòu)造與析構(gòu)異常處理中的構(gòu)造與析構(gòu) 4 異常規(guī)格說明異常規(guī)格說明 5 異常是錯(cuò)誤的事件或運(yùn)行期間發(fā)生的反常,有兩種類型:異常是錯(cuò)誤的事件或運(yùn)行期間發(fā)生的反常,有兩種類型:l同步異常,在運(yùn)行期間產(chǎn)生并可使用同步異常,在運(yùn)行期間產(chǎn)生并可使用throw拋出拋出l異步異常,由硬件或運(yùn)行環(huán)境引起的異步錯(cuò)誤異步異常,由硬件或運(yùn)行環(huán)境引起的異步錯(cuò)誤 6

20、 異常處理是異常處理是c+一個(gè)特性,它支持以一種標(biāo)準(zhǔn)的方式處理一個(gè)特性,它支持以一種標(biāo)準(zhǔn)的方式處理錯(cuò)誤,即通過關(guān)鍵字錯(cuò)誤,即通過關(guān)鍵字throw, try, catch實(shí)現(xiàn)。實(shí)現(xiàn)。ltry塊包含一個(gè)塊包含一個(gè)throw語(yǔ)句的測(cè)試塊語(yǔ)句的測(cè)試塊lthrow產(chǎn)生一個(gè)異常給異常處理器產(chǎn)生一個(gè)異常給異常處理器lcatch異常處理器必須在異常處理器必須在try塊之后塊之后本章小結(jié)本章小結(jié)面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)布置作業(yè)布置作業(yè)編程并上機(jī)驗(yàn)證:編程并上機(jī)驗(yàn)證: 1、編譯運(yùn)行以下代碼,體會(huì)異常處理、編譯運(yùn)行以下代碼,體會(huì)異常處理3個(gè)關(guān)鍵字個(gè)關(guān)鍵字try、catch和和throw的作的作用,并寫出運(yùn)行結(jié)果

21、。用,并寫出運(yùn)行結(jié)果。 using namespace std; int main( ) cout 開始開始 endl; try cout 進(jìn)入進(jìn)入try塊塊 endl; throw 999; cout 該語(yǔ)句不應(yīng)執(zhí)行該語(yǔ)句不應(yīng)執(zhí)行; catch( int i ) cout 捕捉的異常為:捕捉的異常為:; cout i endl; cout 結(jié)束結(jié)束; 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)布置作業(yè)(續(xù))布置作業(yè)(續(xù))2、分析以下代碼,寫出運(yùn)行結(jié)果,并與題、分析以下代碼,寫出運(yùn)行結(jié)果,并與題1對(duì)比分析運(yùn)行結(jié)果。對(duì)比分析運(yùn)行結(jié)果。 using namespace std; int main( ) cout

22、 開始開始 endl; try cout 進(jìn)入進(jìn)入try塊塊 endl;throw 999;cout 該語(yǔ)句不應(yīng)執(zhí)行該語(yǔ)句不應(yīng)執(zhí)行; catch( double i ) cout 捕捉的異常為:捕捉的異常為:;cout i endl; cout 結(jié)束結(jié)束; 面向?qū)ο蟪绦蛟O(shè)計(jì)(C+描述)布置作業(yè)(續(xù))布置作業(yè)(續(xù))3、編譯運(yùn)行以下代碼,分析運(yùn)行結(jié)果。、編譯運(yùn)行以下代碼,分析運(yùn)行結(jié)果。using namespace std; class CB public: void print() cout Catch the class CB endl; ;class CD: public CB public: void print( ) cout Catch the class CD endl; ;int main( ) CD derived;try throw derived; catch( CB b ) cout Catch a base class: ;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論