c++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式terminate,
學會使用terminate函式有助於異常處理
一 當乙個異常產生的時候呼叫terminate函式,**:
[cpp] view plaincopyprint?
#include
#include
using namespace std;
void on_terminate()
int main(void)
terminate被呼叫的情況:
1 當傳送乙個異常,並且建構函式產生異常
2 當傳送乙個異常,或者析構函式產生異常
3 乙個靜態物件的構造或者析構傳送乙個異常
4 以atexit註冊的函式發生異常的時候
5 自定義乙個異常,但是實際上沒有異常產生的時候
6 呼叫預設的unexcepted()函式時候
例子說話:
[cpp] view plaincopyprint?
#include
#include
using namespace std;
void on_terminate()
class custom_exception
custom_exception(const custom_exception& excep)
};
void case_1()
catch(...)
} 當乙個函式丟擲了乙個throw異常的時候,如果該函式內部構造了物件的話,系統會先對該物件呼叫析構函式,當物件呼叫完了析構函式以後,才開始執行異常的丟擲工作。
同時在具有繼承關係的類的異常中,子類的異常應該放在前面,而基類的異常應該放到最後面,這樣可以使子類的異常先獲得處理,父類的異常最後處理。
[cpp] view plaincopyprint?
#include
using namespace std;
class x
; //注意:類中巢狀類的申明和定義,學習!!!
class small: public trouble {};
class big:public trouble {};//類中的繼承!!!
void f()
};
int main()
catch(x::trouble &)
catch(x::small&)
catch(x::big&)
return 0;
}
如果這樣的話,丟擲的big()型別異常則被trouble類壟斷,應該倒著寫才可以實現順序捕獲所有異常,另外使用...可以捕捉所有的異常,這個應該放到最後麵才可以。
省略號異常處理器不允許接受任何引數,所以無法得到任何相關異常的資訊,也無法知道異常的型別,這種catch語句經常用於清理資源並重新丟擲所捕獲的異常。
C 異常處理之terminate函式
c 中處理異常的過程是這樣的 在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式 terminate 學會使用terminate函式有助於異...
C 之異常處理
程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如 句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式...
C 之異常處理
基本理念 問題的檢測和問題的解決分離,程式的問題檢測部分可以不用了解如何處理問題 異常處理是一同通訊機制,程式的不同部分就出現了什麼錯誤進行通訊 異常是通過丟擲 throw 物件而引發 raise 的,該物件的型別決定了應該啟用哪個處理 被選中的處理 是呼叫鏈中與該物件型別匹配且離丟擲異常位置最為接...