在討論C++異常處理之前,先看看一個C語言編程中常見的例子:
#include <stdio.h>
FILE *fp;
Fp=fopen(“test.txt”,”r”);
If(fp==NULL)
{
printf(“Can’t Open File!/n”);
exit(0);
}
一個健壯的程序需要考慮很多會使程序失效的因素,如果對各種因素都進行如上的條件判斷,那麼整個程序的結構就會變得非常混亂。
C++處理錯誤的方法由不一樣,它有如下特點:
1、 不需要打亂程序的結構,如果沒有任何錯誤產生,那麼程序的運行應該不受任何影響。
2、 不依靠函數的返回值來報告錯誤是否產生。
3、 即使採用集中的方式處理錯誤,也能夠根據錯誤種類的不同來進行對應的錯誤處理操作。
下面來看看C++中提供的異常機制是如何做到這幾點的。
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
double *data;
try
{
data=new double[1000];
}
////std::bad_alloc是new操作符唯一可能發出的異常
catch(std::bad_alloc)
{
cout<<"can't alloc memory!"<<endl;
exit(0);
}
////捕獲所有剩下的異常
catch(...)
{
}
delete []data;
ShowMessage("ok");
return 0;
}
///---------------------------------------------------------------------------
使用異常的語法很簡單,對所有可能產生異常的語句包含在try塊中,並在隨後的catch語句中捕獲發生的異常。一個try塊後可以跟隨幾個不同的catch語句,用來捕獲不同的異常。如果希望捕獲任何可能發生的異常,應該使用catch(…)語句。如果希望在自己編寫的程序中產生異常,可以按如下的方法:
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
class Out{};
int main(int argc, char* argv[])
{
try
{
throw Out(); ///拋出一個臨時的Out對象
}
catch(Out& e) ///捕獲Out異常
{
cout<<"Out Exception throwed!"<<endl;
throw; ///向外層拋出異常
}
return 0;
}
///---------------------------------------------------------------------------
利用關鍵字throw可以拋出任意的對象。這個對象不需要繼承exception類。即使是基本類型數據,也可以作爲throw的參數拋出。在catch的參數中如果包含一個類似變量聲明的表達式,就可以在catch塊中使用這個異常對象。如果在catch塊中處理完一個異常後,異常造成的後果並不能完全消除,那麼可以在catch語句中再次調用catch語句,從而使得捕獲向外層傳播。如果一個函數中沒有處理髮生的異常,那麼異常將會傳播到調用此函數的代碼段中。
正文