1. 程式人生 > >c++異常處理,異常宣告,捕獲異常

c++異常處理,異常宣告,捕獲異常

C++ 捕獲異常的一些規則:

1.  MFCc++ 異常應該用過引用來捕獲。使用引用來捕獲異常不需要刪除c++ 異常物件。因為使用引用捕獲的異常物件會在棧中傳遞。而且保持了多型性,使得你捕獲的異常正是你丟擲的異常物件。使用指標捕獲異常的話,需要你刪除異常物件。使用值捕獲的話,會導致物件的slicing 問題。更詳細的資訊見Effective  C++13.

2.    MFC 異常應該通過指標來捕獲。因為它們通常從堆中分配。當你處理完異常之後,你需要呼叫Delete 成員函式。如下所示:

       try

{

  ……

}

catch(CFileException *e)

{

  // 異常處理

  e->Delete();

}

因此,你不能用省略(catch (…)) 來捕獲MFC 異常, 這通常會導致記憶體洩露。必須使用Delete 成員函式來刪除異常,而不要使用delete ,因為一些MFC 異常作為靜態物件建立。

一旦你捕獲了異常,你可以通過執行下列典型動作組合來處理:

●  什麼也不做

●  修改這個問題並重新執行程式碼

●  修改這個問題但不重新執行程式碼

●  如果使用者需要的話,向用戶顯示出錯資訊。

●  如果出現的問題不是程式錯誤的話,輸出一個跟蹤的診斷訊息。

●  如果出現的問題是一個程式錯誤,輸出一個斷言。

● 

在日誌檔案裡記錄這個問題

●  如果異常是不可恢復的,終止程序的執行。

●  回收已分配的資源

●  重新丟擲這個異常,或者丟擲一個新的異常。

使用預設捕獲處理器(catch ( … ))

預設捕獲處理器可以捕獲任何一個型別的異常。包括系統產生和程式產生的異常。其行為和switch 語句的default 類似。這種處理方式功能很強大,使用也很方便。但是如果使用不當的話,是很有害的,因為你不能確定出現了什麼問題。你能知道的就是在一些不知道的地方發生了你不知道的異常。因此,你沒法知道在當前這個函式處理異常合適,還是在更高一級的函式處理合適,你也不知道究竟處理這個異常是不是合適。注意異常處理不當會破壞你的程式,或造成其他型別的破壞。所以你應該儘量不使用預設的捕獲異常處理器。

然而,下面兩種情況下,使用預設的捕獲處理器是非常合適的:

●  處理器將重新丟擲同一個異常,或丟擲另一個異常。預設捕獲處理器經常用

於整理資源或重新丟擲異常。

●  異常處理器在任何情況下結束程序。

在解構函式裡不要丟擲異常,這通常會造成程序終止。我已經除錯過不只一次這種情況了。蹩腳的異常程式碼反而會把程式弄得更糟糕。

異常宣告規範:

C++ 提供的異常宣告規範:

// 正常的函式宣告,可以丟擲任意的異常

Void NormalFunction();

// 不丟擲異常

Void NoThrowFunction throw();

// 只丟擲指定異常

class ExceptionClass;

Void ThrowFunction() throw (ExceptionClass); // 包括ExceptionClass 的派生型別。