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

下載本文檔

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

文檔簡介

1、第第9 9章異常處理章異常處理n9.1 9.1 程序中潛在的異常問題程序中潛在的異常問題n9.2 9.2 異常處理機(jī)制異常處理機(jī)制n9.3 C+9.3 C+中的異常處理中的異常處理( (重點(diǎn)重點(diǎn)) )n9.4 9.4 標(biāo)準(zhǔn)異常標(biāo)準(zhǔn)異常n9.5 9.5 使用異常處理應(yīng)注意的幾個問題使用異常處理應(yīng)注意的幾個問題第9章異常處理2022-3-213n程序中潛在的異常問題:程序中潛在的異常問題:【例【例9-1】求解一元二次方程】求解一元二次方程ax2+bx+c=0。源代碼如下:。源代碼如下:#include#includeusing namespace std;int main() float a,b,

2、c; double x1,x2; coutabc; x1=(-b+sqrt(b*b-4*a*c)/2*b; x2=(-b-sqrt(b*b-4*a*c)/2*b; cout方程的實(shí)根是方程的實(shí)根是: x1=x1 x2=x2endl; return 0;第9章異常處理2022-3-214n異常(異常(ExceptionException)是程序運(yùn)行時可以檢測到的一些非正常情)是程序運(yùn)行時可以檢測到的一些非正常情況。如除數(shù)為況。如除數(shù)為0 0,數(shù)組越界訪問,內(nèi)存空間不夠,輸入輸出不,數(shù)組越界訪問,內(nèi)存空間不夠,輸入輸出不正常(文件找不到、輸入數(shù)據(jù)類型錯等)等等。正常(文件找不到、輸入數(shù)據(jù)類型錯等)

3、等等。n異常是程序錯誤一種形式。異常是程序錯誤一種形式。n程序中的錯誤按性質(zhì)可分為:程序中的錯誤按性質(zhì)可分為:n語法錯誤語法錯誤n邏輯錯誤邏輯錯誤n異常異常第9章異常處理2022-3-215n異常處理機(jī)制提供了系統(tǒng)層次上的標(biāo)準(zhǔn)設(shè)施,其異常處理機(jī)制提供了系統(tǒng)層次上的標(biāo)準(zhǔn)設(shè)施,其主要任務(wù)有以下幾點(diǎn):主要任務(wù)有以下幾點(diǎn):n能夠在異常發(fā)生時,在執(zhí)出點(diǎn)拋出異常,并將有關(guān)異常的信能夠在異常發(fā)生時,在執(zhí)出點(diǎn)拋出異常,并將有關(guān)異常的信息以類型的形式傳遞到異常處理模塊;息以類型的形式傳遞到異常處理模塊;n建立模塊之間的異常通信機(jī)制,特別是在多層模塊之間實(shí)現(xiàn)建立模塊之間的異常通信機(jī)制,特別是在多層模塊之間實(shí)現(xiàn)異常

4、有序的傳遞,保證拋出的每個異常都能被適當(dāng)?shù)漠惓L幃惓S行虻膫鬟f,保證拋出的每個異常都能被適當(dāng)?shù)漠惓L幚砟K捕獲。保證異常發(fā)生時能自動釋放異常模塊所占用的理模塊捕獲。保證異常發(fā)生時能自動釋放異常模塊所占用的系統(tǒng)資源。系統(tǒng)資源。n對于不執(zhí)行異常處理的代碼沒有任何額外的運(yùn)行負(fù)擔(dān)。對于不執(zhí)行異常處理的代碼沒有任何額外的運(yùn)行負(fù)擔(dān)。n將異常處理代碼從普通代碼中分離出來。將異常處理代碼從普通代碼中分離出來。 第9章異常處理2022-3-216第9章異常處理2022-3-217n異常拋出、檢測和捕獲的語法定義如下:異常拋出、檢測和捕獲的語法定義如下:異常拋出:異常拋出:throw throw 表達(dá)式;表達(dá)式;

5、異常的檢測和捕獲由異常的檢測和捕獲由try-catchtry-catch結(jié)構(gòu)實(shí)現(xiàn):結(jié)構(gòu)實(shí)現(xiàn):trytry 被檢測可能會發(fā)生異常的語句被檢測可能會發(fā)生異常的語句 catch(catch(異常的類型異常的類型) ) 異常處理的語句異常處理的語句 第9章異常處理2022-3-218n 【例【例9-39-3】對例】對例9-19-1中的程序增加異常處理部分。中的程序增加異常處理部分。#include#includeusing namespace std;int main() float a,b,c; double x1,x2; coutabc; try if(0 = b) throw b;/ throw

6、表達(dá)式中表達(dá)式中b并無意義,代表并無意義,代表float型即可型即可 if(b*b-4*a*c)0) throw 1.0; x1=(-b+sqrt(b*b-4*a*c)/2*b; x2=(-b-sqrt(b*b-4*a*c)/2*b; cout方程的實(shí)根是方程的實(shí)根是: x1=x1 x2=x2endl; catch(float)/捕獲捕獲float類型的異常類型的異常 cout系數(shù)系數(shù)b不能為不能為0,方程無解,方程無解!endl; catch(double) /捕獲捕獲double類型的異常類型的異常 cout開方為負(fù)值,方程無解開方為負(fù)值,方程無解!endl;cout程序結(jié)束程序結(jié)束!en

7、dl;return 0;第9章異常處理2022-3-219【例【例9-4】函數(shù)嵌套情況下的異常處理。源代碼如下:】函數(shù)嵌套情況下的異常處理。源代碼如下:#include#include#includeusing namespace std;typedef struct zero/聲明除數(shù)為零異常類型聲明除數(shù)為零異常類型string s;ZERO;typedef struct negative/聲明開方值為負(fù)異常類型聲明開方值為負(fù)異常類型string s;NEGATIVE;fun2(int a,int b,int c)/拋出異常的函數(shù)拋出異常的函數(shù)ZERO s1;NEGATIVE s2; s1.

8、s=除數(shù)為零除數(shù)為零;s2.s=開方值為負(fù)數(shù)開方值為負(fù)數(shù);if(0 = b) throw s1;if(b*b-4*a*c)0) throw s2;return sqrt(b*b-4*a*c);第9章異常處理2022-3-2110fun1(int a,int b,int c) /捕獲異常并重新拋出異常捕獲異常并重新拋出異常try return(-b+fun2(a,b,c)/2*b;catch(ZERO) throw;/重新拋出異常重新拋出異常第9章異常處理2022-3-2111int main() float a,b,c; coutabc; try cout方程的一個實(shí)根是方程的一個實(shí)根是: x

9、1=fun1(a,b,c)endl; catch(ZERO S1) /捕獲除數(shù)為零異常捕獲除數(shù)為零異常,并處理異常并處理異常 coutS1.s,方程無解,方程無解!endl; catch(NEGATIVE S2)/ 捕獲開方值為負(fù)數(shù)異常捕獲開方值為負(fù)數(shù)異常,并處理異常并處理異常 coutS2.s,方程無解,方程無解!endl; cout程序結(jié)束程序結(jié)束!endl; return 0;第9章異常處理2022-3-2112異常處理開始本模塊中是否有try-cacth結(jié)構(gòu)進(jìn)行異常處理是否有匹配的Cacth子句Cacth子句是否重新拋出異常異常處理結(jié)束是否有上級模塊(調(diào)用棧是否為空)是否有匹配的Cac

10、th子句進(jìn)行異常正理終止程序運(yùn)行否是是否是是否是否否第9章異常處理2022-3-2113n其語法形式如下:其語法形式如下:函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (函數(shù)參數(shù)表函數(shù)參數(shù)表) throw () throw (異常類型表異常類型表) )n其中異常類型表包括該函數(shù)中所有可以拋出的異常類型,其中異常類型表包括該函數(shù)中所有可以拋出的異常類型,異常類型之間用逗號分開。異常接口聲明是函數(shù)接口的一異常類型之間用逗號分開。異常接口聲明是函數(shù)接口的一部分,是函數(shù)使用者和函數(shù)之間的協(xié)議。部分,是函數(shù)使用者和函數(shù)之間的協(xié)議。 第9章異常處理2022-3-2114【例【例9-5】異常處理中析構(gòu)函數(shù)的調(diào)用。源代碼

11、如下:】異常處理中析構(gòu)函數(shù)的調(diào)用。源代碼如下:/example9_5.cpp#include using namespace std;void Fun( void );class intArray public:intArray (int n) p = new int n ; cout 構(gòu)造構(gòu)造intArray,分配具有,分配具有 n個元素的數(shù)組。個元素的數(shù)組。 endl;intArray () delete p; cout 析構(gòu)析構(gòu)intArray,釋放資源。,釋放資源。 endl; private: int *p;第9章異常處理2022-3-2115void Fun() intArray

12、ia(10); cout 在在Fun()中拋擲整型異常。中拋擲整型異常。 endl; throw 1;int main() try cout 在主函數(shù)的在主函數(shù)的try塊中調(diào)用函數(shù)塊中調(diào)用函數(shù)Fun()。 endl; Fun(); catch( int ) cout 在主函數(shù)在主函數(shù)catch子句捕獲到整型異常子句捕獲到整型異常, ; cout 并進(jìn)行異常處理。并進(jìn)行異常處理。 endl; cout 程序結(jié)束程序結(jié)束! endl; return 0;第9章異常處理2022-3-2116【例【例9-6】帶有層次結(jié)構(gòu)異常類的異常處理。源代碼如下:】帶有層次結(jié)構(gòu)異常類的異常處理。源代碼如下:/exa

13、mple9_6.cpp#include #include using namespace std;class Excp/聲明異?;惵暶鳟惓;?public: static void print( string msg )/ 打印錯誤信息打印錯誤信息 coutmsgendl;class pushOnFull : public Excp/聲明棧滿異常類聲明棧滿異常類 public:pushOnFull( int i ) : tempvalue( i ) int getTempValue() return tempvalue; private:int tempvalue;/存放異常發(fā)生時沒有壓棧

14、的值存放異常發(fā)生時沒有壓棧的值;第9章異常處理2022-3-2117class popOnEmpty : public Excp /聲明棧空異常類聲明??债惓n?;class newError : public Excp/聲明動態(tài)分配內(nèi)存異常類聲明動態(tài)分配內(nèi)存異常類 ;class otherError : public Excp/聲明其它異常類聲明其它異常類 ;第9章異常處理2022-3-2118class Stack public:Stack( int capacity=10 ) throw (newError);/建立一空棧,其容量的缺省值為建立一空棧,其容量的缺省值為10Stack()d

15、elete elements;/析構(gòu)函數(shù),釋放數(shù)組資源析構(gòu)函數(shù),釋放數(shù)組資源void push( int value ) throw (pushOnFull);/壓棧壓棧void pop(int &top_value) throw (popOnEmpty);/出棧出棧bool isfull()return top maxsize? false : true;bool isempty()return top ? false : true;int size() return top; void display(); private:int top;/棧頂指針棧頂指針int * elemen

16、ts;/存放棧中元素的棧數(shù)組存放棧中元素的棧數(shù)組int maxsize;/??扇菁{元素的個數(shù)??扇菁{元素的個數(shù);第9章異常處理2022-3-2119Stack: Stack( int capacity):top(0), maxsize(capacity)elements = new intcapacity;/動態(tài)創(chuàng)建棧數(shù)組動態(tài)創(chuàng)建棧數(shù)組if(0=elements) throw newError();/如果分配失敗,拋出異常如果分配失敗,拋出異常void Stack:pop( int &top_value )if ( isempty() ) throw popOnEmpty();/棧空,

17、則拋出異常???,則拋出異常top_value = elements -top ;void Stack:push( int value )if ( isfull() ) throw pushOnFull(value);/棧滿拋出異常,并將未入棧元素值傳送給異常處理?xiàng)M拋出異常,并將未入棧元素值傳送給異常處理elementstop+ = value;第9章異常處理2022-3-2120void Stack:display()if ( !size() ) cout 棧中已沒有元素!棧中已沒有元素!n; return; cout (棧中有棧中有 size() 個元素個元素)( bottom: ;for

18、 ( int i = 0; i top; +i ) cout elementsi ; cout :top )n;第9章異常處理2022-3-2121int main() int i,n,count;try cout n; Stack myStack(n); cout n; for ( i = 1; i = n; count=+i ) myStack.push( i ); myStack.display(); cout n; for ( i = 1; i = n; count=i+ ) int x; myStack.pop( x ); cout 已出棧已出棧count個元素個元素!n; 第9章異

19、常處理2022-3-2122catch(pushOnFull e) e.print(棧已滿!棧已滿!); cout 棧中有棧中有count-1個元素個元素,; cout 值為值為e.getTempValue()的元素沒有壓入棧中!的元素沒有壓入棧中!n;catch(newError) newError:print(給棧分配空間時出錯!給棧分配空間時出錯!);catch(popOnEmpty) cout 已出棧已出棧count個元素個元素,; popOnEmpty:print(棧已空!棧已空!);catch(Excp) Excp:print(程序其它異常在此處理!程序其它異常在此處理!);ret

20、urn 0;第9章異常處理2022-3-2123n標(biāo)準(zhǔn)異常類的層次結(jié)構(gòu)標(biāo)準(zhǔn)異常類的層次結(jié)構(gòu) exceptionlogic_errorruntime_errorbad_allocbad_exceptionbad_castbad_typeidios_base:failurelength_errordomain_errorout_of_rangeinvalid:argumentrange_erroroverflow_errorunderflow:error第9章異常處理2022-3-2124n標(biāo)準(zhǔn)異常的根是標(biāo)準(zhǔn)異常的根是exceptionexception類類 ,其聲明如下:,其聲明如下:names

21、pace std /exception namespace std /exception 類在命名空間類在命名空間std std 中中 class exception class exception public: public: exception() throw();/ exception() throw();/缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù) exception( const exception & ) throw();/exception( const exception & ) throw();/拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù) exception& operator=( c

22、onst exception& ) throw();/exception& operator=( const exception& ) throw();/拷貝賦值操作符拷貝賦值操作符 virtual exception() throw();/virtual exception() throw();/析構(gòu)函數(shù)(虛函數(shù))析構(gòu)函數(shù)(虛函數(shù)) / what()/ what()返回一個字符串,用于異常的文本描述。返回一個字符串,用于異常的文本描述。 virtual const charvirtual const char* * what() const throw(); what

23、() const throw(); 第9章異常處理2022-3-2125n 【例【例9-79-7】標(biāo)準(zhǔn)異常的使用?!繕?biāo)準(zhǔn)異常的使用。#include/#include/標(biāo)準(zhǔn)異常的頭文件標(biāo)準(zhǔn)異常的頭文件#include#include#include#includeusing namespace std;using namespace std;class Arrayclass Array public: public:Array(const char Array(const char * *source, int sz)source, int sz) size = sz; size = sz;

24、ca = new charsize; ca = new charsize; for ( int i = 0; i size; +i ) for ( int i = 0; i size; +i ) if ( !source ) if ( !source ) cai = 0; cai = 0; else else cai = sourcei; cai = sourcei; 第9章異常處理2022-3-2126n 【例【例9-79-7】標(biāo)準(zhǔn)異常的使用?!繕?biāo)準(zhǔn)異常的使用。char &operator( int i ) constchar &operator( int i ) const

25、 if ( i = size ) if ( i = size ) string es = string es =數(shù)組越界!數(shù)組越界!;throw out_of_range( es ); /throw out_of_range( es ); /將將eses字符串傳給字符串傳給out_of_rangeout_of_range對象。對象。 return cai;return cai; private:private:int size;char int size;char * *ca;ca;第9章異常處理2022-3-2127n 【例【例9-79-7】標(biāo)準(zhǔn)異常的使用。】標(biāo)準(zhǔn)異常的使用。int main

26、()int main() try try char ca = A,B,C,D,E,F; char ca = A,B,C,D,E,F;Array CA( ca, sizeof(ca)/sizeof(char) );/Array CA( ca, sizeof(ca)/sizeof(char) );/實(shí)例化一個字符數(shù)組類實(shí)例化一個字符數(shù)組類CA5=X;/CA5=X;/正常訪問字符數(shù)組類正常訪問字符數(shù)組類CA6=G;/CA6=G;/越界訪問數(shù)組類將引發(fā)異常越界訪問數(shù)組類將引發(fā)異常return 0;return 0; catch ( const out_of_range &excp )catch

27、 ( const out_of_range &excp ) cout excp.what()endl;/ cout excp.what()endl;/通過通過what()what()成員函數(shù)可以獲取異常信息成員函數(shù)可以獲取異常信息return -1;return -1; 第9章異常處理2022-3-2128n 1 1、在、在C+C+的程序設(shè)計(jì)中,異常處理應(yīng)主要用于的程序設(shè)計(jì)中,異常處理應(yīng)主要用于獨(dú)立開發(fā)的程序模塊之間的異常通信。獨(dú)立開發(fā)的程序模塊之間的異常通信。n異常處理機(jī)制的使用會影響程序的執(zhí)行效率。因此,即使異常處理機(jī)制的使用會影響程序的執(zhí)行效率。因此,即使C+C+支持異常處理,在

28、程序設(shè)計(jì)時也應(yīng)該具體情況具體分析。在支持異常處理,在程序設(shè)計(jì)時也應(yīng)該具體情況具體分析。在設(shè)計(jì)一個模塊時,如果該模塊發(fā)生異常時遇到下列情況,則設(shè)計(jì)一個模塊時,如果該模塊發(fā)生異常時遇到下列情況,則考慮使用異常處理機(jī)制:考慮使用異常處理機(jī)制:n1) 1) 該模塊本身不知道如何處理發(fā)生的異常,而將由其上級模塊負(fù)責(zé)對該模塊本身不知道如何處理發(fā)生的異常,而將由其上級模塊負(fù)責(zé)對異常的判斷,并選擇采取適當(dāng)?shù)男袆印.惓5呐袛?,并選擇采取適當(dāng)?shù)男袆?。n2) 2) 該模塊必須自己處理異常理問題,或者如果它不能完全處理則必須該模塊必須自己處理異常理問題,或者如果它不能完全處理則必須把異常情況把異常情況“告訴告訴”給使用該模塊的上級模塊,由其上級模塊進(jìn)行處給使用該模塊的上級模塊,由其上級模塊進(jìn)行處理。理。第9章異常處理2022-3-2129n2 2、使用標(biāo)準(zhǔn)異常和異常接口聲明、使用標(biāo)準(zhǔn)異常和異常接口聲明n在創(chuàng)建自定義的異常類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論