C++面向對象程序設計(第二版)-第九章 異常處理_第1頁
C++面向對象程序設計(第二版)-第九章 異常處理_第2頁
C++面向對象程序設計(第二版)-第九章 異常處理_第3頁
C++面向對象程序設計(第二版)-第九章 異常處理_第4頁
C++面向對象程序設計(第二版)-第九章 異常處理_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C+面向對象程序設計(第二版)主編 曹靜 中國水利水電出版社C+面向對象程序設計(第二版)第九章 異常處理2022年5月23日星期一C+面向對象程序設計第九章 異常處理t9.1 異常處理的基本思想t9.2 C+異常處理的實現t9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計9.1 異常處理的基本思想t計算機程序在機器上運行時會產生錯誤,這些錯誤對于編程人員可以預料到但卻無法避免。t在一個小型程序中,一旦程序運行時發生了異常,一般是將程序立即中斷運行,從而無條件釋放所有資源。而在一個較為復雜的軟件中,函數與函數之間存在著各自明確的功能和相互間復雜的調用關系,發現錯誤的

2、函數又并不具備處理錯誤的能力。 2022年5月23日星期一C+面向對象程序設計tC+的異常處理機制使得異常的引發和處理不需要在同一函數內完成,它可以將異常向上傳播,這樣底層的函數可以專門用以解決具體問題,而上層的調用者就可以在適當的位置針對不同類型的異常設計處理。 9.1 異常處理的基本思想2022年5月23日星期一C+面向對象程序設計9.2 C+異常處理的實現t9.2.1 異常處理的機制t9.2.2 異常處理的規則2022年5月23日星期一C+面向對象程序設計9.2.1 異常處理的機制tC+語言提供了對處理異常情況的內部支持。在C+語言中,try、throw和catch語句就是用于實現異常處

3、理的機制。有了C+程序的異常處理機制,程序可以向更高的執行上下文傳遞意想不到的事件,使C+程序能更好地從各種異常事件中進行有效地恢復,從而更好地執行 2022年5月23日星期一C+面向對象程序設計t異常處理的機制的主體有兩大部分,一是錯誤偵測區塊,二是錯誤處理區塊。 9.2.1 異常處理的機制2022年5月23日星期一C+面向對象程序設計try /錯誤偵測區塊 復合語句 throw 異常類型表達式; /如果發生錯誤用throw語句拋出異常catch(異常類型1) /錯誤處理區塊 復合語句catch(異常類型2) /錯誤處理區塊 復合語句 catch() / 如果在前面并沒有列舉異常類型,則由此

4、處理區塊處理 /錯誤處理區塊 復合語句 /try-throw-catch后繼續執行9.2.1 異常處理的機制2022年5月23日星期一C+面向對象程序設計ttry子句后的復合語句是代碼的保護段。catch子句后的復合語句是用來處理異常的程序,處理由throw表達式拋擲的異常。t當錯誤偵測區塊里的程序執行發生錯誤時,將會利用throw語句將異常類型拋出錯誤偵測區塊,在對比catch語句中的異常類型后,尋找出并執行處理該異常類型的程序區塊。當該區塊執行完畢后,將繼續執行catch語句后的程序。9.2.1 異常處理的機制2022年5月23日星期一C+面向對象程序設計t異常處理的執行過程分成以下幾個步

5、驟:l控制通過正常的順序執行到達try語句,然后執行try塊內的代碼保護段。 l如果在保護段執行期間沒有引起異常,就不執行跟在try塊后的catch子句,程序從異常被拋擲的try塊后跟隨的最后一個catch子句后面的語句繼續執行下去。 9.2.1 異常處理的機制2022年5月23日星期一C+面向對象程序設計l如果在保護段執行期間或在保護段調用的任何函數中有異常被拋擲,則從通過throw操作數創建的對象中創建一個異常對象。 l如果匹配的處理器未找到,則運行函數terminate將被自動調用,而函數terminate的默認功能是調用abort終止程序。l如果找到了一個匹配的catch處理程序,且它

6、通過值進行捕獲,則其行參通過拷貝異常對象進行初始化。 9.2.1 異常處理的機制2022年5月23日星期一C+面向對象程序設計9.2.2 異常處理的規則t編寫異常處理程序的規則是: l如果預料某段程序代碼(或對某個函數的調用)有可能發生異常,就將它放在try子句之后。l如果某段程序中出現了自己不能處理的異常,就可以使用throw語句來拋擲出這個異常,將它拋擲給調用者。 2022年5月23日星期一C+面向對象程序設計lcatch子句后的復合語句用來處理由throw表達式拋擲的異常。l當異常被拋擲以后,catch子句便依次被檢查,若某個catch子句的異常類型聲明與被拋擲的異常類型一致,則執行該段

7、異常處理程序。9.2.2 異常處理的規則2022年5月23日星期一C+面向對象程序設計t例:處理除零異常 #include using namespace std;int try_modulus(int,int);void main()try /代碼保護段coutModulus(5,2) is try_modulus(5,2)endl;coutModulus(3,0) is try_modulus(3,0)endl;coutModulus(8,5) is try_modulus(8,5)endl;catch(char *s) /處理異常cerrs;coutend of the program.

8、n;int try_modulus(int x,int y)if(y=0) /檢查被除數是否為零,是則拋出異常throw(exception of dividing zero!n);return x%y;9.2.2 異常處理的規則2022年5月23日星期一C+面向對象程序設計t程序運行結果為: Modulus(5,2) is 1exception of dividing zero!end of the program 9.2.2 異常處理的規則2022年5月23日星期一C+面向對象程序設計t在VC+6.0環境中,為了使用異常處理機制,需要進行以下設置:l打開Project Settings對話

9、框。l選擇C / C+選項卡。l在Category欄中選擇C+ language。l選擇Enable Exception Handling 。9.2.2 異常處理的規則2022年5月23日星期一C+面向對象程序設計9.3 異常處理中的構造與析構tC+異常處理的功能較為完善,它不僅能夠處理各種不同類型的異常,而且具有為異常拋擲前構造的所有局部對象自動調用析構函數的能力。2022年5月23日星期一C+面向對象程序設計t在一個程序中,找到一個匹配的catch異常處理后,如果catch子句的異常類型聲明是一個值參數,那么在初始化時是賦值被拋擲的異常對象。如果catch子句的異常類型聲明是一個引用,那么

10、在初始化時是使該引用指向異常對象。9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計t當catch子句的異常類型聲明參數被初始化,棧的展開過程便開始了。這包括將從對應的try塊開始到異常被拋擲處之間構造且尚未析構的所有自動對象進行析構。析構的順序與構造的順序相反。程序會從最后的一個catch處理之后開始恢復執行。 9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計t例:使用帶析構語義的類的C+異常處理#include using namespace std;void MyFunc(void);class Exptpublic: Expt();

11、 Expt(); const char *ShowReason() const return Expt類異常。; ;9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計class Demopublic: Demo(); Demo();Demo:Demo() cout 構造 Demo. endl;Demo:Demo() cout 析構 Demo. endl;9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計void MyFunc() Demo D; cout 在MyFunc()中拋擲Expt類異常。 endl; throw Expt();int main() cout 在main函數中。 endl; try cout 在try塊中,調用MyFunc()。 endl; MyFunc(); 9.3 異常處理中的構造與析構2022年5月23日星期一C+面向對象程序設計 catch( Expt E ) cout 在catch異常處理程序中。 endl; cout 捕獲到Expt類型異常:; cout E.ShowReason() endl; catch( char *str ) cout 捕獲到其它的異常: str endl; cout 回到main函數。從這里恢復執行。 endl; return

溫馨提示

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

評論

0/150

提交評論