異常是一種程式控制機制,與函式機制獨立和互補
1.若有異常則通過throw操作建立乙個異常物件並丟擲;
2.將可能丟擲的異常程式段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行try塊內的保護段。
3.如果在保護執行段執行期間沒有引起異常,那麼在try塊後的catch子句就不執行。程式從try塊後跟隨的最後乙個catch子句後面的語句執行下去。
4.catch子句按照其在try塊後出現的順序檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。
5.如果匹配的處理器沒有找到,則執行函式的terminate將被自動呼叫,其預設功能是呼叫abort終止程式。
6.處理不了的異常,可以在catch的最後乙個分支,使用throw語法,向上扔。
基本語法:
#includeusing丟擲的異常不處理,程式會異常中斷:namespace
std;
//發生異常之後,是丟擲跨函式的
void divide(int x, int
y) cout
<< "
x/y =
"<< x / y <
}void mydivide(int x,int
y)int
main()
catch (int
e)
catch(...)//
其他型別的異常
system(
"pause");
return0;
}
接受異常後還可以繼續在處理中丟擲異常。
catch異常時,按照型別catch。
異常捕捉嚴格按照型別匹配:
int結果為:main()
catch (int
e)
catch
(...)
;system(
"pause");
return0;
}
可見 並沒有處理隱式的型別轉換,嚴格按照型別抓取。
異常處理的基本思想:
1.c++的異常處理機制使得異常的引發和異常的處理不必在同乙個函式中,這樣底層函式可以著重的解決具體問題,而不必過多的考慮異常的處理。上層呼叫者可以在適當的位置設計對不同型別異常的處理。
2.異常時專門針對抽象程式設計中的一系列錯誤處理的,c++中不能借助函式機制,因為棧結構的本質時先進後出,依次訪問,無法進行跳躍,但錯誤處理的特徵卻是遇到錯誤資訊就想要轉到若干級之上進行重新嘗試。如圖:
3.異常超脫於函式機制,決定了其對於函式的跨越式回跳。
4.異常跨越函式。
棧解旋
異常被丟擲後,從進入try塊起,到異常被拋擲前,這期間在棧上的構造的所有物件,都會被自動析構。析構的順序和構造的順序相反,這一過程稱為棧的解旋(unwinding)。
舉例:
#includeusing根據上述規則,執行結果為:namespace
std;
class
test3
~test3()
private
:
inta;
intb;
};void
mydivide()
intmain()
catch (int
e)
catch (...)//
其他型別的異常
system(
"pause");
return0;
}
異常介面的申明:
1.為了加強語法的可讀性,可以在函式申明中列出可能丟擲的所有異常型別,例如:void func() throw (a,b,c,d);//這個函式能且只能丟擲型別為abcd及其子型別的異常(多型)。
2.如果沒有申明,可以丟擲任何型別的異常。
3.乙個函式不丟擲任何型別的異常可以申明為:void func() throw();
4.如果乙個函式丟擲了它的異常介面申明所不允許丟擲的異常,程式就會異常結束。
異常處理機制
異常處理的三個步驟 檢查異常,丟擲異常,處理異常 異常處理基本原理 把需要檢測的程式放到try塊中,把異常處理的程式放在catch塊中。如果執行乙個函式出現了異常,可以丟擲異常資訊。然後查詢try塊下面的catch塊是否可以處理該異常。如果該函式不處理該異常,將傳遞給它的上一級函式 呼叫函式 如果它...
異常處理機制
1 c 中異常處理機制使得異常的引發和異常的處理不必在同乙個函式中。2 異常是專門針對抽象程式設計中的一系列錯誤處理的,c 的函式機制是棧結構,先進後出,依次訪問,無法跳躍。3 異常超脫於函式機制,決定了其對函式的跨越式回跳。4 異常跨越函式 普通用法 基本用法 void add int a,int...
異常處理機制
異常處理機制分為以下2點 異常處理五個關鍵字 try catch finally throw throws 用了try catch程式出現異常不會終止,會丟擲異常繼續執行下面任務 public static void main string args catch error e catch exce...