C++的異常處理

程序中常見的錯誤有兩種:語法錯誤和運行時錯誤

語法錯誤一般在編譯的時候會給出提示,但是運行時錯誤則不是那麼容易發現的。有的甚至能正常運行,但是不能給出正確的結果,或者程序非正常終止,或者導致死機。

因此,所有導致出現這些非正常情況的都屬於異常。在程序中我們要自己給出相應的異常處理機制,來避免出現自己未預料到的結果。


C++給出的異常處理機制由三部分組成:檢查(try)、拋出(throw)、捕捉(catch)。

把需要檢查的語句放在try塊中,throw用來在出現異常的時候發出一個異常信息,catch用來捕捉這個信息,如果捕捉到了,就處理它。


語法:

throw 語句一般是由throw運算符和一個數據組成的,形式爲     throw   表達式

try-catch結構爲  

try

{

要檢查的語句塊;

}

catch (異常信息類型 [變量名])

{

處理異常的語句;

}

說明:

(1)被檢查語句必須放在try語句塊中,否則不起作用

(2)try和catch必須放在一起,中間不能隔其他的語句。也可以只有try,沒有catch,表示只檢查異常,並不做處理。

(3)try和catch的語句塊必須用花括號括起來,即使只有一個語句也不能省略。

(4)一個try-catch結構中,可以只有一個try,但可以有很多catch塊,來匹配不同的異常類型。

(5)catch後面的小括號中,一般只寫異常信息的類型名,如catch(double)。catch只檢查異常信息的類型,而不檢查他們的值。

因此,如果要捕捉不同的異常類型,應當由throw拋出不同的異常類型。另外,catch後面的小括號裏也可以指定變量名,這樣

在throw拋出異常時若指定了變量,可以由catch指定的變量來獲取異常變量的拷貝。以便於後面對該異常信息的需要。

(6)若catch後面的小括號中沒有類型名,只有...。即catch(...),表示可以捕捉到任何類型的異常。這種catch子句應該放在try-catch結構的

最後,表示捕捉到異常的其他情況。否則,其他的catch將不起作用。

(7)try-catch結構可以出現在同一個函數中,也可以不出現在同一個函數中。在異常出現的時候,系統會自動先在本函數中尋找匹配的catch,

如果找不到匹配的,則會去距離該try最近的catch尋找匹配,直到找到匹配的catch結構。

(8)在有些情況下,throw可以不包括任何表達式,表示我不處理這個異常,交給上級函數去處理。

(9)如果throw拋出的異常找不到匹配的catch子句去處理,則系統會調用一個系統函數terminate,使程序終止運行。


例子

#include <iostream>
using namespace std;
intmain( )
{void f1( );
try
{f1( );}//調用f1( )
catch(double)
{cout<<″OK0!″<<endl;}
cout<<″end0″<<endl;
return 0;
}
void f1( )
{void f2( );
try
{f2( );} // 調用f2( )
catch(char)
{cout<<″OK1!″;}
cout<<″end1″<<endl;
}
void f2( )

{void f3( );

try
{f3( );} // 調用f3( )
catch(int)
{cout<<″Ok2!″<<endl;}
cout<<″end2″<<endl;
}
void f3( )
{double a=0;
try 
{throw a;} //拋出double類型異常信息
catch(float)
{cout<<″OK3!″<<endl;}
cout<<″end3″<<endl;
}

程序運行結果如下: 
OK0!(在主函數中捕獲異常)
end0 (執行主函數中最後一個語句時的輸出)


如果將f3函數中的catch子句改爲
catch(double),而程序中其他部分不變,則程序運
行結果如下:
OK3!(在f3函數中捕獲異常)
end3 (執行f3函數中最後一個語句時的輸出)
end2 (執行f2函數中最後一個語句時的輸出)
end1 (執行f1函數中最後一個語句時的輸出)
end0 (執行主函數中最後一個語句時的輸出)


如果在此基礎上再將f3函數中的catch塊改爲
catch(double)
{cout<<″OK3!″<<endl;throw;}
程序運行結果如下: 
OK3!(在f3函數中捕獲異常)
OK0! (在主函數中捕獲異常)
end0 (執行主函數中最後一個語句時的輸出)


發佈了28 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章