C++異常處理

在討論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語句,從而使得捕獲向外層傳播。如果一個函數中沒有處理髮生的異常,那麼異常將會傳播到調用此函數的代碼段中。
正文 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章