版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年商標(biāo)保護(hù)義務(wù)協(xié)議
- 2025年健身房特選設(shè)備訓(xùn)練服務(wù)協(xié)議
- 2025年基層金融質(zhì)押協(xié)議
- 2025年連帶責(zé)任保證合同(借款)
- 中小企業(yè)2024年期限勞動(dòng)合同3篇
- 正規(guī)2025年度藝人經(jīng)紀(jì)合同3篇
- 二零二五年度足療技師外出服務(wù)安全協(xié)議范本
- 2025年度度假酒店委托運(yùn)營(yíng)管理服務(wù)合同
- 二零二五年度汽車牌照租賃與車輛抵押貸款服務(wù)協(xié)議
- 2025年度門窗行業(yè)產(chǎn)品召回與質(zhì)量追溯合同電子版
- 江蘇省南京市協(xié)同體七校2024-2025學(xué)年高三上學(xué)期期中聯(lián)合考試英語(yǔ)試題答案
- 青島版二年級(jí)下冊(cè)三位數(shù)加減三位數(shù)豎式計(jì)算題200道及答案
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識(shí)課件
- 干部職級(jí)晉升積分制管理辦法
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預(yù)算實(shí)例:清單與計(jì)價(jià)樣本
- VOC廢氣治理工程中電化學(xué)氧化技術(shù)的研究與應(yīng)用
- 煤礦機(jī)電設(shè)備培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論