程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式時,出現陣列越界等錯誤。如果對於這些錯誤沒有採取有效的防範措施,那麼往往會得不到正確的執行結果,程式不正常終止或嚴重的會出現宕機現象。我們把程式執行時的錯誤統稱為異常,對異常處理稱為異常處理。c++中所提供的異常處理機制結構清晰,在一定程度上可以保證程式的健壯性。
c++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式terminate,由它呼叫abort終止程式。這樣的異常處理方法使得異常引發和處理機制分離,而不在同乙個函式中處理。這使得底層函式只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處程式設計客棧理的任務交給上一層函式去處理。
c++的異常處理機制有3部分組成:try(檢查),throw(丟擲),catch(捕獲)。把需要檢查的語句放在try模組中,檢查語句發生錯誤,throw丟擲異常,發出錯誤資訊,由catch來捕獲異常資訊,並加以處理。一般throw丟擲的異常要和catch所捕獲的異常型別所匹配。異常處理的一般格式為:
複製www.cppcns.com** **如下:
trycatch(異常型別1)
catch(異常型別2)
...下面我們用示例演示一下異常處理:
複製** **如下:
#include "stdafx.h"
#include
template
t div(t x,t y)
int main()
catch(int)//異常型別
catch(double)//異常型別
return0;
}結果:
看了上述的示例**,也許有人會問,第二個雙精度型別的除法計算也應該丟擲異常才對啊,在實際的執行過程中並非如此,其實該雙精度型別除法函式根本沒有被執行過。以上程式的執行規程為:呼叫函式div(x,y)時發生異常,由函式div中的語句"throw y"丟擲異常,並不在往下執行return x/y,接著catch捕獲int型別的異常並處理異常,最後直接執行"return 0"。因此函式div(x1,y1)和catch(double){}模組根本沒有被執行。如果,我們把y的值改為1,則結果就變成為:
如果在執行try語句模組時,沒有發生異常,則catch語句塊不起作用,流程轉到其後的語句繼續執行。從上述兩個結果中可知第一次throw丟擲的int型別所以找到處理該型別的catch,而第二次是丟擲double型別所找到的是處理double型別的catch。
下面對異常處理補充幾點:(1)try和catch塊中必須要用花括號括起來,即使花括號內只有乙個語句也不能省略花括號;(2)try和catch必須成對出現,乙個try_catch結果中只能有乙個try塊,但可以有多個catch塊,以便與不同的異常資訊匹配;(3www.cppcns.com)如果在catch塊中沒有指定異常資訊的型別,而用刪節號"...",則表示它可以捕獲任何型別的異常資訊;(4)如果throw不包括任何表示式,表示它把當前正在處理的異常資訊再次丟擲,傳給其上一層的catch來處理;(5)c++中一旦丟擲乙個異常,如果程式沒有任何的捕獲,那麼系統將會自動呼叫乙個系統函式terminate,由它呼叫abort終止程式;
最後還是一樣,我將用乙個示例來總結一下今天所講的內容(開發工具:vs2010):
複製** **如下:
#include "stdafx.h"
#include
template
t div(t x,t y)
int main()
catch(...)//捕獲任意型別異常
}return0;
}結果:
本文標題: c++之異常處理詳解
本文位址:
C 異常處理詳解
捕獲異常 捕獲異常的語法為 trycatch 異常型別 try 和 catch 都是c 中的關鍵字,後跟語句塊,不能省略 try 中包含可能會丟擲異常的語句,一旦有異常丟擲就會 獲。從 try 的意思可以看出,它只是 嘗試 捕獲異常,如果沒有異常丟擲,那就什麼也不捕獲。catch 用來處理 try ...
異常處理詳解(C )
什麼是異常處理?異常是指程式在執行過程中出現的以外情況。異常通常會使程式的正常流程被打斷。例如,算數運算中被除數為0 陣列下標越界 開啟檔案是檔案不存在等等。一般情況下,程式中需要對異常進行處理,通過對異常情況的處理,可以發現產生異常的原因,並進行必要的異常處理,從而值程式的執行流程繼續走下去。為什...
C 異常處理詳解
異常介紹 www.cppcns.com1 system.exception類 message屬性 發生異常的原因和異常的內容 souce屬性 丟擲異常程式集的名稱 stacktrace屬性 發生異常的方法呼叫情況 innerexception屬性 次異常中包含的異常 2 try catch fina...