c++異常處理,異常宣告,捕獲異常
C++ 捕獲異常的一些規則:
1. 非MFC 的c++ 異常應該用過引用來捕獲。使用引用來捕獲異常不需要刪除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 的派生型別。