程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式時,出現陣列越界等錯誤。如果對於這些錯誤沒有採取有效的防範措施,那麼往往會得不到正確的執行結果,程式不正常終止或嚴重的會出現宕機現象。我們把程式執行時的錯誤統稱為異常,對異常處理稱為異常處理。c++中所提供的異常處理機制結構清晰,在一定程度上可以保證程式的健壯性。
一、c++中異常處理
c++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函式中處理,而是丟擲乙個錯誤資訊,把它傳遞給上一級的函式來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,執行系統會自動呼叫系統函式terminate,由它呼叫abort終止程式。這樣的異常處理方法使得異常引發和處理機制分離,而不在同乙個函式中處理。這使得底層函式只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函式去處理。
c++的異常處理機制有3部分組成:try(檢查),throw(丟擲),catch(捕獲)。把需要檢查的語句放在try模組中,檢查語句發生錯誤,throw丟擲異常,發出錯誤資訊,由catch來捕獲異常資訊,並加以處理。一般throw丟擲的異常要和catch所捕獲的異常型別所匹配。異常處理的一般格式為:
try
catch(異常型別1)
catch(異常型別2)
...
如果在執行try語句模組時,沒有發生異常,則catch語句塊不起作用,流程轉到其後的語句繼續執行。
對異常處理注意幾點:
(1)try和catch塊中必須要用花括號括起來,即使花括號內只有乙個語句也不能省略花括號;
(2)try和catch必須成對出現,乙個try_catch結果中只能有乙個try塊,但可以有多個catch塊,以便與不同的異常資訊匹配;
(3)如果在catch塊中沒有指定異常資訊的型別,而用刪節號"...",則表示它可以捕獲任何型別的異常資訊;
(4)如果throw不包括任何表示式,表示它把當前正在處理的異常資訊再次丟擲,傳給其上一層的catch來處理;
(5)c++中一旦丟擲乙個異常,如果程式沒有任何的捕獲,那麼系統將會自動呼叫乙個系統函式terminate,由它呼叫abort終止程式;
(6)遇到異常,不會執行之後操作。除非有finally語句,執行return及以後的操作,然後執行finally語句塊,若finally語句有return,則覆蓋之前的return。
舉個栗子:
#include using namespace std;
templatet div(t x,t y)
int main()
catch(...)
catch(int)
catch(double)
} system("pause");
return 0;
}
輸出為:
呼叫函式div(x,y)時發生異常,由函式div中的語句"throw y"丟擲異常,並不在往下執行cout << "異常後還能執行" << endl;,接著catch捕獲...任意型別的異常,然後throw把當前異常繼續丟擲,傳給上一層catch,直到catch(double)捕獲到,最後直接執行"return 0"。
二、c語言的中異常處理
1.使用標準c庫提供了abort()和exit()兩個函式,它們可以強行終止程式的執行,其宣告處於標頭檔案中。
2.使用assert(斷言)巨集呼叫,位於標頭檔案中,當程式出錯時,就會引發乙個abort()。
使用exit()函式進行異常終止:
#include #include double diva(double num1,double num2) //兩數相除函式
int main()
exit的函式原型:void exit(int)由此,我們也可以知道exit_failure巨集應該是乙個整數,exit()函式的傳遞引數是兩個巨集,乙個是剛才看到的exit_failure,還有乙個是exit_success從字面就可以看出乙個是出錯後強制終止程式,而乙個是程式正常結束。他們的定義是:
#define exit_success 0
#define exit_failure 1
當出現異常的時候,程式是終止了,但是我們並沒有捕獲到異常資訊。
使用exit()函式進行異常終止:
assert()是乙個除錯程式時經常使用的巨集,切記,它不是乙個函式,在程式執行時它計算括號內的表示式,如果表示式為false (0), 程式將報告錯誤,並終止執行。如果表示式不為0,則繼續執行後面的語句。這個巨集通常原來判斷程式中是否出現了明顯非法的資料,如果出現了終止程式以免導致嚴重後果,同時也便於查詢錯誤。
另外需要注意的是:assert只有在debug版本中才有效,如果編譯為release版本則被忽略。
我們就前面的問題,使用assert斷言進行異常終止操作:構造可能出現出錯的斷言表示式:assert(number!=0)這樣,當除數為0的時候,表示式就為false,程式報告錯誤,並終止執行。
**如下:
#include #include double diva(double num1,double num2) //兩數相除函式
int main()
python中常見的異常
python常見異常型別大概分為以下類 1.assertionerror 當assert斷言條件為假的時候丟擲的異常 2.attributeerror 當訪問的物件屬性不存在的時候丟擲的異常 3.indexerror 超出物件索引的範圍時丟擲的異常 4.keyerror 在字典中查詢乙個不存在的ke...
Java Java中常見的異常
空指標異常類 nullpointerexception 型別強制轉換異常 classcastexception 陣列負下標異常 negativearrayexception 陣列下標越界異常 arrayindexoutofbound ception 違背安全原則異常 secturityexcepti...
python中常見的異常
python中的異常 zerodivision 除數為0 indexerror 索引值超出範圍 取列表或字串中元素可能出現 keyerror 關鍵字在字典中不存在 nameerror 訪問的變數不存在 assertionerror 斷言不成立 asser語句不成立 try 檢測範圍語句塊 excep...