C 異常處理

2021-06-21 15:28:16 字數 2553 閱讀 9189

程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式時,出現陣列越界等錯誤。如果對於這些錯誤沒有採取有效的防範措施,那麼往往會得不到正確的執行結果,程式不正常終止或嚴重的會出現宕機現象。我們把程式執行時的錯誤統稱為異常,對異常處理稱為異常處理。c++中所提供的異常處理機制結構清晰,在一定程度上可以保證程式的健壯性。

c++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式terminate,由它呼叫abort終止程式。這樣的異常處理方法使得異常引發和處理機制分離,而不在同乙個函式中處理。這使得底層函式只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函式去處理。

1、c++異常處理語法 

c++的異常處理機制有3部分組成:try(檢查),throw(丟擲),catch(捕獲)。把需要檢查的語句放在try模組中,檢查語句發生錯誤,throw丟擲異常,發出錯誤資訊,由catch來捕獲異常資訊,並加以處理。一般throw丟擲的異常要和catch所捕獲的異常型別所匹配。異常處理的一般格式為:

trycatch(異常型別1)

catch(異常型別2)

...下面我們用示例演示一下異常處理:

#include "stdafx.h"

#include template t div(t x,t y)

int main()

模組根本沒有被執行。如果,我們把y的值改為1,則結果就變成為:

如果在執行try語句模組時,沒有發生異常,則catch語句塊不起作用,流程轉到其後的語句繼續執行。從上述兩個結果中可知第一次throw丟擲的int型別所以找到處理該型別的catch,而第二次是丟擲double型別所找到的是處理double型別的catch。

下面對異常處理補充幾點:(1)try和catch塊中必須要用花括號括起來,即使花括號內只有乙個語句也不能省略花括號;(2)try和catch必須成對出現,乙個try_catch結果中只能有乙個try塊,但可以有多個catch塊,以便與不同的異常資訊匹配;(3)如果在catch塊中沒有指定異常資訊的型別,而用刪節號"...",則表示它可以捕獲任何型別的異常資訊;(4)如果throw不包括任何表示式,表示它把當前正在處理的異常資訊再次丟擲,傳給其上一層的catch來處理;(5)c++中一旦丟擲乙個異常,如果程式沒有任何的捕獲,那麼系統將會自動呼叫乙個系統函式terminate,由它呼叫abort終止程式;

例子:#include "stdafx.h"

#include template t div(t x,t y)

int main()

請注意觀察上述類的層次結構,可以看出,標準異常都派生自乙個公共的基類exception。基類包含必要的多型性函式提供異常描述,可以被過載。下面是exception類的原型: 

class exception 

3、異常處理函式

在標準c++中,還定義了數個異常處理的相關函式和型別(包含在標頭檔案中): 

namespace std 

其中的terminate相關函式與未**獲的異常有關,如果一種異常沒有被指定catch模組,則將導致terminate()函式被呼叫,terminate()函式中會呼叫ahort()函式來終止程式。可以通過set_terminate(terminate_handler)函式為terminate()專門指定要呼叫的函式,例如: 

#include

#include

using namespace std; 

//定義point結構體(類) 

typedef struct tagpoint 

point; 

//扔出point異常的函式 

static void f() 

//set_terminate將指定的函式 

void terminatefunc() 

int main() 

catch (int) //捕獲int異常 

//point將不能**獲到,引發terminatefunc函式被執行 

return 0; 

}  這個程式將在控制台上輸出 "set_terminate指定的函式" 字串,因為point型別的異常沒有**獲到。當然,它也會彈出圖1所示對話方塊(因為呼叫了abort()函式)。 

上述給出的僅僅是乙個set_terminate指定函式的例子。在實際工程中,往往使用set_terminate指定的函式進行一些清除性的工作,其後再呼叫exit(int)函式終止程式。這樣,abort()函式就不會被呼叫了,也不會輸出圖1所示對話方塊。 

關於標準c++的異常處理,還包含一些比較複雜的技巧和內容,我們可以查閱《more effective c++》的條款9~條款15。

參考:1 

2 3 c++ primer page 580~

C 異常處理

結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...

c 異常處理

一 概述 c 自身有著非常強的糾錯能力,發展到如今,已經建立了比較完善的異常處理機制。c 的異常情況無非兩種,一種是語法錯誤,即程式中出現了錯誤的語句,函式,結構和類,致使編譯程式無法進行。另一種是執行時發生的錯誤,一般與演算法有關。關於語法錯誤,不必多說,寫 時心細一點就可以解決。c 編譯器的報錯...

C 異常處理

程式設計師常常忽視異常處理的重要性,這給他們自己的 造成相當大損害。本文將討論如何在c 中使用異常處理,並介紹在應用 中新增 片段以防止某些錯誤的一些簡單方法,這些錯誤可能導致程式異常終止。結構化異常處理 net框架提供一種標準的錯誤報告機制稱為結構化異常處理。這種機制依賴於應用中報告錯誤的異常。在...