標籤:測試 通知 size 變數 前言 產生 函數 解決 聲明
前言
大型和十分複雜的程式往往會產生一些很難尋找的甚至是無法避免的執行階段錯誤。當發生執行階段錯誤時,不能簡單地結束程式運行,而是退回到任務的起點,指出錯誤,並由使用者決定下一步工作。物件導向的異常處理(exception handling)機制是C++語言用以解決這個問題的有力工具。函數執行時,放在try(測試)程式塊中的任何類型的資料對象發生異常,都可被throw塊拋出,隨即沿調用鏈退回,直到被catch塊捕獲,並在此執行異常處理,報告出現的異常等情況。從拋出到捕獲,應將各嵌套調用函數殘存在棧中的自動對象、自動變數和現場保護內容等進行清除。如果已退到入口函數還未捕獲則由abort()來終結入口函數。
這裡所講的異常(exception)是程式可能檢測到的,運行時不正常的情況,如儲存空間耗盡、數組越界、被0除等等,可以預見可能發生在什麼地方,但是無法確知怎樣發生和何時發生。特別在一個大型的程式(軟體)中,程式各部分是由不同的小組編寫的,它們由公用介面連起來,錯誤可能就發生在相互的配合上,也可能發生在事先根本想不到的個別的條件組合上。
C++提供了一些內建的語言特性來產生(raise)或拋出(throw)異常,用以通知“異常已經發生”,然後由預先安排的程式段來捕獲(catch)異常,並對它進行處理。這種機制可以在C++程式的兩個無關(往往是獨立開發)的部分進行“異常”通訊。由程式某一部分引發了另一部分的異常,這一異常可回到引起異常的部分去處理(沿著程式函數的調用鏈)。這也是分清處理責任的好辦法。
異常規範
C++函數有2個傳回值,左側是正常返回,右側是異常返回
float Div(int a,int b)預設是拋出所有異常
float Div(int a,int b)throw(int,short,Test)規定只能拋出int、short、Test類型的異常。如果是float類型異常,則無法拋出
異常處理的機制
首先,在C++中異常往往用類(class)來實現,以棧為例,異常類聲明如下:
class popOnEmpty{...}; //棧空異常
class pushOnFull{...}; //棧滿異常
C++——異常處理