簡單地說,異常就是程序在運行過程中,由于使用環(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ā)現錯誤的函數中處理異常,就沒有機會把上層函數已經完成的一些工作做妥善的處理。
因此,對于這些可以預料的錯誤,在程序設計時,應編制相應的預防代碼或處理代碼,以便防止異常發(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 : "<
18 cout<<"The result of x/y is : "<
【運行結果】同樣的,在Visual C++中新建一個【C++ Source File】文件,輸入上述的代碼,編譯無誤后運行。
【范例解析】上述代碼中,定義了函數fuc(),用于返回兩個數的商,并處理當除數為0時的異常,在主函數main()中第17行調用fuc()函數時出現了一個除數為0的異常,其并不輸出兩個數的商,而是調用代碼中第4~9行的異常處理,輸出錯誤信息并異常退出程序。
注意:exit()函數用于退出程序,該函數可加參數,其中exit(0)表示正常退出程序,而exit(1)表示異常退出程序。
當然,如果是在大中型程序中,上述處理方法就過于簡單。這是因為在大中型程序中,函數之間有著明確的分工和復雜的調用關系。由于在這些程序中,發(fā)現錯誤的程序往往在函數調用鏈的底層,如果簡單地在發(fā)現錯誤的函數中處理異常,就沒有機會把上層函數已經完成的一些工作做妥善的處理。

