面向對象方法vc8異常處理_第1頁
面向對象方法vc8異常處理_第2頁
面向對象方法vc8異常處理_第3頁
面向對象方法vc8異常處理_第4頁
面向對象方法vc8異常處理_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

第8章異常處理本章主要內容異常處理概述異常處理的語法應用實例程序的錯誤包括編譯錯誤(即語法錯誤)和邏輯錯誤。邏輯錯誤是程序員設計不當造成的。有的邏輯錯誤是可以預見的。C++稱這些邏輯錯誤為異常。異常處理概述

在程序能正確支持所設計的正常情況之后,再添加語句來處理異常情況,這種思想就是異常處理。在C++中專門提供了這種機制,程序員在編寫程序的時候首先需要假裝不會產生任何異常寫好用于處理正常情況的語句,之后,利用C++的異常處理機制,添加用于處理異常情況的語句。異常處理實現

C++語言提供對處理異常情況的內部支持。try,throw和catch語句就是C++語言中用于實現異常處理的機制。有了C++異常處理,程序可以向更高的執(zhí)行上下文傳遞意想不到的事件,從而使程序能更好地從這些異常事件中恢復過來。異常處理的語法try-throw-catch是拋出和捕獲異常的基本機制。Throw語句拋出異常(一個值),catch捕獲異常。拋出一個異常后,try塊會終止,轉而執(zhí)行catch塊中的語句。catch塊結束之后,會繼續(xù)執(zhí)行catch塊之后的語句(前提是catch塊中沒有終止程序或者執(zhí)行另外一些特殊的操作)。如果try塊中沒有拋出異常,那么在try塊結束之后,程序將從catch塊之后的語句繼續(xù)執(zhí)行。換言之,如果沒有拋出異常,catch塊會被忽略。try塊

如果在函數內直接用throw拋出一個異常(或在函數調用時拋出一個異常),將在異常拋出時退出函數。如果不想在異常拋出時退出函數,可以在函數體內創(chuàng)建一個特殊塊用于解決程序中潛在的錯誤,在這個塊中可以測試各種錯誤發(fā)生的可能性,通常稱為測試塊,它由關鍵字try引導。其定義格式如下:try{<語句>}拋出異常

通常將拋出的值直接稱為一個異常,所以執(zhí)行throw語句就稱為拋出異常,可以拋出任意類型的一個值。其定義的格式如下:

throw<拋出值的表達式>

執(zhí)行throw語句時,外圍的try塊就會停止執(zhí)行。如果try塊之后跟有一個合適的catch塊,那么控制權就會轉交給那個catch塊。一般說來,throw語句幾乎肯定要嵌入一個分支語句(比如if語句)中。捕獲異常

拋出一個異常后,外圍的try塊會停止執(zhí)行,并開始執(zhí)行另一個部分的語句,也就是catch塊。執(zhí)行catch的過程稱為捕獲異?;蛘弋惓L幚?。一個異常被拋出以后,最終應該由某個catch塊來處理。一般說來,catch塊參數主要完成兩件事情:catch塊參數前要加一個類型名,表示catch塊可以捕獲什么類型的異常拋出值;catch塊參數為捕獲的異常拋出值指定了一個名稱,所以在catch塊中,又可以對這個異常拋出值進行相應的處理。catch塊的語法定義如下:catch(type_namevariable_name){<處理異常的相關語句>}需要注意的是,如果try塊中沒有異常被拋出,那么在try塊正常結束后,程序從catch塊之后的語句繼續(xù)執(zhí)行。換言之,如果沒有拋出異常,catch塊會被忽略。C++對異常處理的基本思想1.把可能造成異常錯誤的程序代碼放到異常模塊內。2.為異常模塊在執(zhí)行過程中所可能產生的異常錯誤提供異常處理模塊。3.異常處理模塊通常放在程序正常流程的外面。如“零作分母”的一種異常處理形式doublediv(doublea,doubleb){if(b==0)

throwb;returna/b;}接上voidmain(){try{cout<<"7.3/2.0="<<div(7.3,2.0)<<endl;cout<<"7.3/0.0="<<div(7.3,0.0)<<endl;}catch(double){cout<<"零作分母異常"<<endl;}cout<<"主調程序結束"<<endl;}異常模塊異常處理模塊“零作分母”的另一種異常處理形式main(){try{inti=500;j=0;i/=j;throw"dividedbyzero";}拋出char*類型的“對象”接上catch(char*excep){cout<<excep<<endl;}cout<<"主調程序結束"<<endl;}處理下標越界的錯誤classvector{int*p;intsz;public:vector(intsize) {p=newint[size]; sz=size;} ~vector() {delete[]p;} classrange{};空類型接上

int&operator[](inti) {if(i>=0&&i<sz)returnp[i]; throwrange(); }};拋出的是一個range類型對象接上

voidmain(){vectorv(10); try{v[0]=1;v[10]=13; } catch(vector::range) {cout<<"數組調用超界"<<endl;}}異常要點1.一般而言throw應由try語句包括。但有時throw不由try語句包括時,catch將抓不到異常。這時,由系統(tǒng)將該異常向上拋給調用它的函數,請求該函數抓作該異常。如仍然抓不到該異常,系統(tǒng)將繼續(xù)往上層拋。如最終main()函數都不處理該異常。則由系統(tǒng)處理。接上2.C++允許有多個異常。例如:classvector{int*p;intsz;enum{max=32000};public:classsize_class{};vector(intsize){if(size<0||max<size)throwsize_class();

p=newint[size];sz=size;} ~vector(){delete[]p;}classrange_class{};

int&operator[](inti){if(i>=0&&i<sz)returnp[i];throwrange_class();}};接上

voidmain(){ try{vectorv(32001); v[0]=1;v[10]=13;} catch(vector::range_class) {cout<<"數組調用超界"<<endl;} catch(vector::size_class) {cout<<"數組定義超界"<<endl;}}接上3.異常處理中也可以設置糾正錯誤的代碼。而不僅僅是報警。例如,當數組調用超界時,可由程序自動將值調整為最小值或最大值。但這需要程序員設計合適的代碼。4.異常可以嵌套。但一般較少使用,因會使程序結構顯得更復雜。C++中處理(組織)多個異常的方法1.用枚舉。見下例代碼enumyc{yc1,yc2,yc3};voidmain(){ try{//…ycycobject;throwycobject;}接上catch(ycycobject1) { switch(ycobject1) { caseyc1:cout<<'1';break; caseyc2:cout<<'2';break; caseyc3:cout<<'3';break; } }}接處理(組織)多個異常的方法2.派生類。見下例代碼classbase{//…};classa_base:publicbase{//…};classc_base:publicbase{//…};classc_base:publicbase{//…};接上voidmain(){try{//…basebase_object;a_basea_base_object;b_baseb_base_object;c_basec_base_object;//...throwbase_object;}或a_base_object、b_base_object、c_base_object接上catch(basebase_object){//…}catch(a_basea_base_object){//…}catch(b_baseb_base_object){//…}catch(c_basec_base_object){//…}}派生類處理異常的優(yōu)點是可以把一些共同的信息放入base類中。接處理(組織)多個異常的方法3.虛函數。見下例代碼classbase{//…virtual異常處理虛函數();};classa_base:publicbase{//…virtual異常處理虛函數();};classc_base:publica_base{//…virtual異常處理虛函數();};接上voidmain(){try{//…basebase_object;a_basea_base_object;b_baseb_base_object;//...throwa_base_object;}直接拋出有異常的相應類對象接上catch(base&object){//…}}拋出的是a_base_object對象,而這里定義的base

溫馨提示

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

最新文檔

評論

0/150

提交評論