傳統(tǒng)的錯誤處理是用不同的數(shù)值來表示不同類型的錯誤,其表達(dá)能力很有限,因為一個數(shù)字包含的信息量太少,而C++異常處理機(jī)制將異常類型化,顯然一個類型要比一個數(shù)字包含的信息量大得多。
比如我們常用的函數(shù)fopen(),當(dāng)打開文件失敗是返回NULL,按照傳統(tǒng)的錯誤處理方法,在調(diào)用Fopen()后立即檢查其返回值,如果為NULL就進(jìn)行錯誤處理,如果將返回NULL改為拋出異常OpenFailed,那么我們就不用在調(diào)用fopen()后馬上檢查返回值,而是在調(diào)用函數(shù)內(nèi)部或者更高層的調(diào)用者那里設(shè)置異常處理器來捕獲這個異常,C++保證:如果一個異常在拋出點(diǎn)沒有得到處理,那么它將一直拋向上層調(diào)用者,直至main()函數(shù),直到找到一個類型匹配的異常處理器,否則調(diào)用terminate()結(jié)束程序。
可以看出:異常處理機(jī)制實際上是一種運(yùn)行時通知機(jī)制。
Class DevidedByZero{};
Double Devide(double a,double b)
{
If(abs(b)::numeric_limits::epsilon())
{
Throw DevidedByZero();//提前檢測異常發(fā)生條件并拋出自定義異常
Return a/b; //這才是可能真正發(fā)出錯誤的地方
}
Void test()
{
Double x=100,y=20.5
Try{
Cout<拋出異常DevidedByZero
}
Catch(DevidedByZero&){
Cerr<< “ Devided by zero!”<
}
}