程序中try、throw、catch三者之間的關系
c++程序中,采用一種專門的結構化處理邏輯的異常處理機制。
1.try語句
try語句塊的作用是啟動異常處理機制,檢測try語句塊中程序語句執行時可能出現的異常。
try語句塊總是與catch一同出現,在一個try語句塊後,至少有一個catch語句塊。
2.throw語句
throw語句用來強行拋出異常,具體格式如下:
throw[異常類型表達式] 異常類型表達式可以是類對象,常量或變量表達式。
3.catch語句塊
catch語句塊首先捕捉try語句塊產生的或有throw拋出的異常,然後進行處理。
catch(形參類型[形參名]) //形參類型可以是c++的基本類型(如int,long,char等)
{
//異常處理語句...
}
catch語句塊中使用該形參名。例如:
try
{
throw "除數不能為0!";
}
catch(const char* s) //制定形參類型名
{
cout<<s<<endl; //使用異常形參名
}
當catch語句塊中的整個形參為“...”時,則表示catch語句塊能夠捕捉任何類型的異常。catch的語句塊前面必須是try語句或者另外一個catch語句塊。
try、throw、catch三者之間的關系和註意點
throw和catch的關系類似函數調用關系,catch指定形參,throw給出實參。編譯器按照catch出現的順序及catch指定的參數類型確定throw拋出的異常應該有哪個catch來處理。
throw不一定出現在try語句塊中,實際上,他可以出現在需要的任何地方,即使在catch的語句塊中,仍然可以繼續使用throw,只要最終有catch可以捕獲它即可。
案例:
class Overflow
{
public:
Overflow(char,double,double);
};
void f(double x)
{
throw Overflow(‘+‘,x,3.45e107); //在函數體中使用throw,用來拋出一個對象
}
try
{
f(1.2);
}catch(Overflow& oo)
{
//處理Overflow類型異常
}
當throw出現在catch語句塊中時,通過throw即可重新拋出一個新類型的異常,也可以重新拋出當前這個異常,在這種情況下,throw不應帶任何實參。
try{
}catch(int)
{
throw "hello exception"; //拋出一個新的異常,異常類型為const char*
}catch(float)
{
throw; } //重新拋出當前的float類型異常
程序中try、throw、catch三者之間的關系