C 異常處理之terminate函式

2021-07-03 10:03:06 字數 1808 閱讀 9098

c++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式

terminate

, 學會使用terminate函式有助於異常處理

一 當乙個異常產生的時候呼叫terminate函式,**:

[cpp] view plaincopyprint?

#include 

#include 

using

namespace

std;  

void

on_terminate()  

intmain(

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()   

};   

intmain()   

catch

(x::trouble &)   

catch

(x::small&)   

catch

(x::big&)   

return

0;   

}   

如果這樣的話,丟擲的big()型別異常則被trouble類壟斷,應該倒著寫才可以實現順序捕獲所有異常,另外使用...可以捕捉所有的異常,這個應該放到最後麵才可以。

省略號異常處理器不允許接受任何引數,所以無法得到任何相關異常的資訊,也無法知道異常的型別,這種catch語句經常用於清理資源並重新丟擲所捕獲的異常。

C 異常處理之terminate函式

c 中處理異常的過程是這樣的 在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式terminate,學會使用terminate函式有助於異常...

C 之異常處理

程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如 句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式...

C 之異常處理

基本理念 問題的檢測和問題的解決分離,程式的問題檢測部分可以不用了解如何處理問題 異常處理是一同通訊機制,程式的不同部分就出現了什麼錯誤進行通訊 異常是通過丟擲 throw 物件而引發 raise 的,該物件的型別決定了應該啟用哪個處理 被選中的處理 是呼叫鏈中與該物件型別匹配且離丟擲異常位置最為接...