C++計算機語言教學(xué)課件 lect11_exception_handling_第1頁
C++計算機語言教學(xué)課件 lect11_exception_handling_第2頁
C++計算機語言教學(xué)課件 lect11_exception_handling_第3頁
C++計算機語言教學(xué)課件 lect11_exception_handling_第4頁
C++計算機語言教學(xué)課件 lect11_exception_handling_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+C+計算機語言教學(xué)課件計算機語言教學(xué)課件lect11_exception_handlinlect11_exception_handling gObjectives In this chapter, you will learn: what exceptions are and when to use them using try, catch and throw to detect, handle and indicate exceptions respectively what exception class is and how to use it drawback of except

2、ion handling and useful advices10.1 Introduction What are Exceptions and Exception handling? Exceptions indicate problems that occur during a programs execution, and the problems are special that they occur infrequently. Exception handling means resolve exceptions and make the programs robust and fa

3、ult-tolerant( allow a program to continue executing or notify the user of the problem).10.1 Introduction When can we use Exception handling? After distinguishing exceptions from errors. Exception is a special kind of error that the user can not estimate and occurs infrequently. ( Once an error is ha

4、ndled, it is no longer an error. ) For example, when user want to create a file.Exceptions can be these:1. the disk is full 2. do not have permission to create a file. 10.1 Introduction 常見的異常 系統(tǒng)資源不足系統(tǒng)資源不足1)內(nèi)存不足:不可以動態(tài)申請內(nèi)存空間2)磁盤不足:不能創(chuàng)建新的文件 用戶操作導(dǎo)致運算關(guān)系不正確用戶操作導(dǎo)致運算關(guān)系不正確如分母為0、數(shù)學(xué)運算溢出、數(shù)組越界、參數(shù)類型不能轉(zhuǎn)換等。 異常的特點 偶

5、然性和可預(yù)見性異常的存在和出現(xiàn)可以預(yù)見,但不會總是發(fā)生。 嚴(yán)重性一旦異常產(chǎn)生,程序可能終止或運行結(jié)果未知。10.1 Introduction 異常處理方法 不做處理(很多程序都是這樣,但不建議) 發(fā)布錯誤信息,然后終止程序的運行(在C語言中,往往這樣處理) 適當(dāng)?shù)奶幚懋惓?,使程序可以繼續(xù)運行(最佳的選擇)10.1 Introduction Exception Handling Mechanism(異常處理機制)1. throwing an exception(拋出異常信號)(拋出異常信號): Some library software or your code signals(發(fā)出信號) th

6、at something unusual has happened.2. handling the exception: At some other place in your program you place the code that deals with the exceptional case.10.2 try, catch and throw Keyword try followed by braces( ) Should enclose Statements that might cause exceptions Statements that should be skipped

7、 in case of an exceptionExample:try int* ptr = new int1000000000000000 ;10.2 try, catch and throw Keyword catch( Catch Handlers )Immediately follow by a try block. ( Every try block has one or more catch handlers )Example:try infile.open( 1.txt, ios:in ) ; if ( infile.fail() ) throw -1 ; / /拋出整型對象,下

8、面會具體講拋出整型對象,下面會具體講catch ( int i ) / / 捕獲捕獲 int int 型的對象型的對象 cout “Exception:can not open file” endl ; Exception:can not open file Output Keyword catch( Catch Handlers )Executes if exception parameter type matches the exception thrown in the try block.(catch 按其在try塊后出現(xiàn)的順序被檢查,最先匹配的catch塊將處理該異常)10.2 tr

9、y, catch and throwtry / code to trythrow 1.2 ; / float typefloat typecatch ( int ) / handle exceptions of intcatch ( float ) / handle exceptions of floatcatch ( ExceptionClass ) / handle exceptions of ExceptionClass./* code to execute if no exception or catch handler handled exception*/First match w

10、ins!僅僅通過僅僅通過類型類型而不是通過而不是通過值值來來匹配的,匹配的,所以catch塊的參數(shù)可以沒有參數(shù)名稱,只需要參數(shù)沒有參數(shù)名稱,只需要參數(shù)類型。類型。異常處理的思想函數(shù)g()調(diào)用者 調(diào)用關(guān)系 異常傳播方向 函數(shù)h() 引發(fā)并拋出異常函數(shù)f()捕獲并處理異常10.2 try, catch and throw10.2 try, catch and throw 棧展開拋出異常的時候,將暫停當(dāng)前函數(shù)的執(zhí)行,開始查找匹配的catch子句。首先檢查throw本身是否在try 塊內(nèi)部,如果是,檢查與該catch相關(guān)的catch子句,看是否其中之一與拋出對象相匹配。如果找到匹配的 catch,就處

11、理異常;如果找不到,就退出當(dāng)前函數(shù)(釋放當(dāng)前函數(shù)的內(nèi)在并撤銷局部對象),并且繼續(xù)在調(diào)用函數(shù)中查找。這個過程,稱之為棧展開(stack unwinding),沿嵌套函數(shù)調(diào)用鏈繼續(xù)向上,直到為異常找到一個catch子句。只要找到能夠處理異常的catch子句,就進(jìn)入該 catch子句,并在該處理代碼中繼續(xù)執(zhí)行。當(dāng)catch結(jié)束的時候,在緊接在與該 try 塊相關(guān)的最后一個 catch 子句之后的點繼續(xù)執(zhí)行。10.2 try, catch and throw 異常與析構(gòu)函數(shù) 因異常而退出函數(shù)時,編譯器保證適當(dāng)?shù)爻蜂N局部對象 如果一個塊直接分配資源,而且在釋放資源之前發(fā)生異常,在棧展開期間將不會釋放該資

12、源。例如,一個塊可以通過調(diào)用 new 動態(tài)分配內(nèi)存,如果該塊因異常而退出,編譯器不會刪除該指針,已分配的內(nèi)在將不會釋放。 析構(gòu)函數(shù)應(yīng)該從不拋出異常 在為某個異常進(jìn)行棧展開的時候,析構(gòu)函數(shù)如果又拋出自己的未經(jīng)處理的另一個異常,將會導(dǎo)致調(diào)用標(biāo)準(zhǔn)庫terminate函數(shù)。一般而言,terminate函數(shù)將調(diào)用abort函數(shù),強制從整個程序非正常退出。 標(biāo)準(zhǔn)庫類型都保證它們的析構(gòu)函數(shù)不會引發(fā)異常10.2 try, catch and throw Keyword catch( Catch Handlers )Process uncaught and unexpected exceptions.For t

13、hese exceptions that we do not know but have to handle, we can use catch( ) statement to catch all type of operands. try int* ptr = new int1000000000000000 ; catch( int ) /*/ catch( ) / catchcatch all type of operands to to handlehandle unexpected exception cout “unexpected exception occurs endl ; u

14、nexpected exception occursOutput 10.2 try, catch and throw catch異常說明符匹配原則異常與 catch 異常說明符匹配的規(guī)則比匹配實參和形參類型的規(guī)則更嚴(yán)格,大多數(shù)轉(zhuǎn)換都不允許除下面幾種可能的區(qū)別之外,異常的類型與 catch 說明符的類型必須完全匹配: 允許從非 const 到 const 的轉(zhuǎn)換。也就是說,非 const 對象的 throw可以與指定接受 const 引用的 catch 匹配。 允許從派生類型型到基類類型的轉(zhuǎn)換。 將數(shù)組轉(zhuǎn)換為指向數(shù)組類型的指針,將函數(shù)轉(zhuǎn)換為指向函數(shù)類型的適當(dāng)指針。 在查找匹配 catch 的時候

15、,不允許其他轉(zhuǎn)換。具體而言,既不允許標(biāo)準(zhǔn)算術(shù)轉(zhuǎn)換(比如不允許int到double的轉(zhuǎn)換),也不允許為類類型定義的轉(zhuǎn)換。 10.2 try, catch and throw Keyword throwfollowed by an operand representing the type of exception. 1. The throw operand can be of any type throw 表達(dá)式可以拋出任何類型的對象,包括內(nèi)建類型(int,float 等)2. If the throw operand is an object, it is called an exceptio

16、n object. (常用) Keyword throwtry throw -1 ; /throw 表達(dá)式很像return 語句,在throw處立即返回 catch( int ) cout exception caught ! endl ; catch( ) / 使用 ()可捕捉任意類型的異常,用來處理未知的異常10.2 try, catch and throw exception caught !Output 10.2 try, catch and throw Exception Specifications在函數(shù)的聲明中列出可能拋出的異常類型Example:void fun() throw

17、( int, float, ExceptionClass ) ; /可拋出可拋出int、float、ExceptionClass類型的異常類型的異常2. 若無聲明,則可以拋出任何類型的異常 void fun()3. 不拋出任何類型的異常的聲明如下:void fun() throw() ;表示不拋出異常,如果fun里面的異常沒有被捕捉到,程序終止?10.2 try, catch and throw Example.Since constructors are not able to return values, we often use exception handling to inform

18、the caller whether the construction is a success or not.class A public: A() infile.open( 1.txt, ios:in ) ; if ( infile.fail() ) throw -1 ; private: ifstream infile ; ;int main() try A a ; catch( int ) cout exception: constructor failed endl ; return 0 ; exception: constructor failedOutput 10.2 try,

19、catch and throw 分層嵌套.當(dāng)在低層的trycatch結(jié)構(gòu)塊中不能匹配到相同類型的catch block時,它就會到上層的trycatch塊中去尋找匹配到正確的catch block異常處理模塊。int main() try /這里是嵌套的trycatch結(jié)構(gòu)塊 try cout “ 準(zhǔn)備拋出一個double數(shù)據(jù)類型的異常. endl; throw 0.5; catch( int& value ) cout 在 catch block 中, int數(shù)據(jù)類型處理異常錯誤?!?endl; catch( double& d_value ) cout 在 catch block 中, d

20、ouble數(shù)據(jù)類型處理異常錯誤。” endl; return 0; 10.2 try, catch and throw 分層嵌套.分層嵌套的trycatch塊是可以跨越函數(shù)作用域的。void Func() try /這里實際上也是嵌套在里層的trycatch結(jié)構(gòu)塊 cout “在 try block 中, 準(zhǔn)備拋出一個int數(shù)據(jù)類型的異常.” endl; /由于這個trycatch塊中不能找到匹配的catch block,所以 /它會繼續(xù)查找到調(diào)用這個函數(shù)的上層函數(shù)的trycatch塊。 throw 1; catch( float& value ) cout 在 catch block 中,

21、int數(shù)據(jù)類型處理異常錯誤。” endl; int main() try Func(); cout 在 try block 中, 準(zhǔn)備拋出一個double數(shù)據(jù)類型的異常. endl; throw 0.5; catch( double& d_value ) cout “在 catch block 中, double數(shù)據(jù)類型處理異常錯誤。” endl; catch( int& value ) /這個例子中,F(xiàn)unc()函數(shù)中拋出的異常會在此被處理 cout 在 catch block 中, int數(shù)據(jù)類型處理異常錯誤。” endl; return 0; 10.3 Exception Class D

22、efining an Exception Class Because a throw-statement can throw a value of any type, it is common to define a class whose objects can carry the kind of information you want thrown to the catch-block. A more important reason for a specialized exception class is so you can have a different type to iden

23、tify each possible kind of exceptional situation. An exception class is just a class that happens tobe used as an exception class.10.3 Exception Class Defining an Exception ClassExampleclass ExceptionClasspublic:ExceptionClass() cout“Exception occurs !”endl;int main () try /實例化類ExceptionClass的對象,并將其

24、拋出 throw ExceptionClass() ; /捕獲類ExceptionClass的對象 catch ( ExceptionClass ) cout “Excepiton caught !” endl ; return 0 ; Exception occurs ! Exception caught !Output 10.3 Exception ClassAnother example/ Class DividByZeroException to be used in exception handling for throwing an exception on a division

25、by zeroclass DivideByZeroException public:DivideByZeroException() :message( “attempted to divide by zero” )const char* what() const return message ; private:const char* message ; ;10.3 Exception Class/ 使用示例try throw DivideByZeroException() ; /調(diào)用類DivideByZeroException的構(gòu)造函數(shù),/實例化類DividByZeroException的一

26、個對象,并將其拋出catch ( DivideByZeroException ex ) /捕獲類DividByZeroException的對象 cout “Exception occurrs: ” ex.what() endl ; /調(diào)用成員函數(shù) Exception occurs: attempted to divide by zeroOutput 10.3 Exception Class 標(biāo)準(zhǔn)C+異常類一個基類:一個基類:exception(所有異常的基類)(所有異常的基類)class exception public: exception() throw() ; exception( co

27、nst exception& rhs ) throw() ; virtual exception() throw() ; virtual const char* what() const throw() ; ;兩個派生的異常類兩個派生的異常類logic_erro 報告程序的邏輯錯誤,可在程序執(zhí)行前被檢測到報告程序的邏輯錯誤,可在程序執(zhí)行前被檢測到 runtime_erro 報告程序運行錯誤,只有在運行時才能被檢測到報告程序運行錯誤,只有在運行時才能被檢測到10.3 Exception Class 標(biāo)準(zhǔn)C+異常類 (需要 #include )邏輯錯誤類domain_error 報告違反了前置條件invalid_argument 報告函數(shù)的參數(shù)無效out_of_range 報告參數(shù)越界 運行時錯誤類bad_alloc報告存儲分配錯誤range_error 報告計算中的范圍錯誤overflow_error 報告算術(shù)上溢出underflow_error報告算術(shù)下溢出10.3 Exception Class 標(biāo)準(zhǔn)C+異常類 (需要 #include )其類層次如下:10.3 Exception Class 標(biāo)準(zhǔn)C+異常類

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論