計算機二級考試C++基礎:C++異常概述

字號:

簡單地說,異常就是程序在運行過程中,由于使用環(huán)境的變化及用戶的操作而產生的錯誤。例如,內存不足時,應用程序請求分配內存,程序中出現了以零為除數的錯誤;打印機未打開,導致程序運行中掛接這些設備失敗等,都會引發(fā)異常。對這些錯誤,應用程序如果不能進行合適的處理,將會使程序變得非常脆弱,甚至不可使用。
    因此,對于這些可以預料的錯誤,在程序設計時,應編制相應的預防代碼或處理代碼,以便防止異常發(fā)生后造成嚴重后果。一個應用程序,既要保證其正確性,還應有容錯能力,或者說,既要在正確的應用環(huán)境中,在用戶正確操作時,要運行正常、正確,并且在應用環(huán)境出現意外或用戶操作不當時,也應有合理的反應。
    因此,異常處理對于編寫健壯的軟件來說無疑是非常重要的,是否有完善的異常處理機制也是評價某一程序設計語言優(yōu)劣的一個重要標準。
    異常處理的基本思想
    事實上,所有的程序設計語言對于異常處理的思想基本上都是類似的。簡單地說,就是捕獲異常后進行處理。
    具體地說,處理異常的基本思想是:在底層發(fā)生的問題,逐級上報,直到有能力可以處理異常的那級為止。或者說,在應用程序中,如果某個函數發(fā)現了錯誤并引發(fā)異常,這個函數就將該異常向上級調用者傳遞,考試,大提示請求調用者捕獲該異常并處理該錯誤。如果調用者不能處理該錯誤,就繼續(xù)向上級調用者傳遞,直到異常被捕獲錯誤被處理為止。
    如果程序最終沒有相應的代碼處理該異常,那么該異常最后被C++系統(tǒng)所接受,C++系統(tǒng)就簡單地終止程序運行。異常的傳遞如圖20-1所示。
    由圖20-1讀者可以看出,C++異常處理的目的是在異常發(fā)生時,盡可能地減少破壞,使得其不影響或盡量少地影響程序其他部分的運行。
    提示:總的來說,對于小型程序和大型程序出現異常時,其處理的思想和方法稍有區(qū)別。一般來說,當小型程序在出現異常時,則將程序立即中斷運行,無條件釋放所有資源。
    【范例20-1】異常處理的基本思想。該范例實現當除數為零時,停止運行并給出提示信息,實現代碼如代碼清單20-1所示。
    代碼清單
    1 #include //包含頭文件
    2 #include
    3 double fuc(double x, double y) //定義函數
    4 {
    5 if(y==0) //除數為0
    6 {
    7 cerr<<"error of dividing zero.\n"; //輸出錯誤信息
    8 exit(1); //異常退出程序
    9 }
    10 return x/y; //返回兩個數的商
    11 }
    12 void main()
    13 {
    14 double res;
    15 res=fuc(2,3); //調用函數
    16 cout<<"The result of x/y is : "<    17 res=fuc(4,0); //除數為0發(fā)生異常
    18 cout<<"The result of x/y is : "<    19 }
    【運行結果】同樣的,在Visual C++中新建一個【C++ Source File】文件,輸入上述的代碼,編譯無誤后運行。
    【范例解析】上述代碼中,定義了函數fuc(),用于返回兩個數的商,并處理當除數為0時的異常,在主函數main()中第17行調用fuc()函數時出現了一個除數為0的異常,其并不輸出兩個數的商,而是調用代碼中第4~9行的異常處理,輸出錯誤信息并異常退出程序。
    注意:exit()函數用于退出程序,該函數可加參數,其中exit(0)表示正常退出程序,而exit(1)表示異常退出程序。
    當然,如果是在大中型程序中,上述處理方法就過于簡單。這是因為在大中型程序中,函數之間有著明確的分工和復雜的調用關系。由于在這些程序中,發(fā)現錯誤的程序往往在函數調用鏈的底層,如果簡單地在發(fā)現錯誤的函數中處理異常,就沒有機會把上層函數已經完成的一些工作做妥善的處理。