C++|異常處理機制,讓程式更友好、健壯和易於維護
程式在運行過程中有些錯誤是可以預料但不可避免的,這時就要力爭做到允許使用者排除錯誤,繼續運行程式,或者至少給出適當的提示資訊、C/C++都有各自的異常處理機制。
異常處理的核心思想是把功能模組代碼與系統中可能出現錯誤的處理代碼分離開來,以此來達到使我們的代碼組織起來更美觀、邏輯上更清晰,並且同時從根本上來提高我們軟體系統長時間穩定運行的可靠性。無論哪種程式設計語言,都會有屬於自己的異常處理機制,當然我們的C語言也不例外。
c 語言中錯誤的處理, 通常採用返回值的方式或是置位元全域變數的方式。 這就存在兩個問題。如果返回值正是我們需要的資料,且返回資料同出錯資料容錯差不高。全域變數,在多執行緒中易引發競爭。而且,當錯誤發生時,上級函數要出錯處理,層層上報,造成過多的出錯處理代碼,且傳遞的效率低下。為此 c++提供了異常。
C++在處理異常時,如果在執行一個函數時出現異常,
C++的異常處理機制使得異常的引發和異常的處理不必在同一個函數中,這樣底層的函數可以著重解決具體問題,而不必過多的考慮異常的處理。上層調用者可以再適當的位置設計對不同類型異常的處理。
異常是專門針對抽象程式設計中的一系列錯誤處理的,C++中不能借助函數機制,因為棧結構的本質是先進後出,依次訪問,無法進行跳躍,但錯誤處理的特徵卻是遇到錯誤資訊就想要轉到若干級之上進行重新嘗試,
異常超脫於函數機制,決定了其對函數的跨越式回跳。
使用異常處理機制進行異常處理的語法如下:
try
{
被檢查的語句
}
catch(異常資訊類型 [變數名])
{
進行異常處理的語句
}
try:try 塊中放置可能拋出異常的代碼,try 塊中的代碼被稱為保護代碼。它後面通常跟著一個或多個 catch 塊。
throw:當問題出現時,程式會拋出一個異常。這是通過使用 throw 關鍵字來完成的。您可以使用 throw 語句在代碼塊中的任何地方拋出異常。throw 語句的運算元可以是任意的運算式,運算式的結果的類型決定了拋出的異常的類型。throw語句一般嵌在try語句的if結構中,或嵌在try語句調用的函數的if結構中。
catch:在您想要處理問題的地方,通過例外處理常式捕獲異常。catch 關鍵字用於捕獲異常。catch 塊跟在 try 塊後面,用於捕獲異常。您可以指定想要捕捉的異常類型,這是由 catch 關鍵字後的括弧內的異常聲明決定的。捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。
被檢語句必須放在 try 塊中,否則不起作用。
try...catch 中花括弧不可省。
一個 try-catch 結構中,只能有一個 try 塊,catch 塊卻可以有多個。以便與不同的類型資訊匹配。
一個實例:
#include
double result(double x , double y);// result()函式宣告
int main()
{
double a;
double b;
double z;
std::cout<<"Enter two numbers : a and b ";
while(std::cin>>a>>b)// 當a和b有輸入時進入迴圈
{
try// 對可能出現異常的塊進行監測
{
z = result(a,b);
}
catch(const char * e)// 出現異常則捕獲異常字串並處理
{
std::cout< std::cout<<"Enter a new pair of a and b : "; continue;// 跳出該輪迴圈,進入下一輪while迴圈 } std::cout<<"2.0 * x * y / ( x + y )= : "< } std::cin.get(); return 0 ; } double result(double x , double y) { if( x == -y ) { throw " x = -y is not allowed! ";// 拋出異常字串 } return 2.0 * x * y / ( x + y ) ; } 異常跨越函數分析: 把可能發生異常的語句放在 try 語句聲當中。try 原有語句的執行流程。 若未發生異常,catch 子語句並不起作用。程式會流轉到 catch 子句的後面執行。 若 try 塊中發生異常,則通過 throw 拋出異常。throw 拋出異常後,程式立即離開本函數,轉到上一級函數。 throw 拋出資料,類型不限。既可以是基底資料型別,也可以是構造資料類型。 程式流轉到main 函數以後,try語句塊中拋出進行匹配。匹配成功,執行 catch 語句,catch 語句執行完畢後。繼續執行後面的語句。如無匹配,系統調用 terminate 終止程式。 C++除了上述的異常處理機制以外,還提供了以下三種處理異常的方式: 簡單粗暴的方法:abort()或者exit。 基於goto語句的異常處理。 setjmp和longjmp的組合。 改寫exception異常類的虛函數。 reference: http://www.1024do.com/?p=2455 -End-
try...catch 中花括弧不可省。
一個 try-catch 結構中,只能有一個 try 塊,catch 塊卻可以有多個。以便與不同的類型資訊匹配。
一個實例:
#include
double result(double x , double y);// result()函式宣告
int main()
{
double a;
double b;
double z;
std::cout<<"Enter two numbers : a and b ";
while(std::cin>>a>>b)// 當a和b有輸入時進入迴圈
{
try// 對可能出現異常的塊進行監測
{
z = result(a,b);
}
catch(const char * e)// 出現異常則捕獲異常字串並處理
{
std::cout< std::cout<<"Enter a new pair of a and b : "; continue;// 跳出該輪迴圈,進入下一輪while迴圈 } std::cout<<"2.0 * x * y / ( x + y )= : "< } std::cin.get(); return 0 ; } double result(double x , double y) { if( x == -y ) { throw " x = -y is not allowed! ";// 拋出異常字串 } return 2.0 * x * y / ( x + y ) ; } 異常跨越函數分析: 把可能發生異常的語句放在 try 語句聲當中。try 原有語句的執行流程。 若未發生異常,catch 子語句並不起作用。程式會流轉到 catch 子句的後面執行。 若 try 塊中發生異常,則通過 throw 拋出異常。throw 拋出異常後,程式立即離開本函數,轉到上一級函數。 throw 拋出資料,類型不限。既可以是基底資料型別,也可以是構造資料類型。 程式流轉到main 函數以後,try語句塊中拋出進行匹配。匹配成功,執行 catch 語句,catch 語句執行完畢後。繼續執行後面的語句。如無匹配,系統調用 terminate 終止程式。 C++除了上述的異常處理機制以外,還提供了以下三種處理異常的方式: 簡單粗暴的方法:abort()或者exit。 基於goto語句的異常處理。 setjmp和longjmp的組合。 改寫exception異常類的虛函數。 reference: http://www.1024do.com/?p=2455 -End-