程式執行時常會碰到一些異常情況,例如:
● 做除法的時候除數為 0;
● 使用者輸入年齡時輸入了乙個負數;
● 用 new 運算子動態分配空間時,空間不夠導致無法分配;
這些異常情況,如果不能發現並加以處理,很可能會導致程式崩潰。
c++ 引入了異常處理機制。其基本思想是:函式 a 在執行過程中發現異常時可以不加處理,而只是「丟擲乙個異常」給 a 的呼叫者,假定為函式 b。
丟擲異常而不加處理會導致函式 a 立即中止,在這種情況下,函式 b 可以選擇捕獲 a 丟擲的異常進行處理,也可以選擇置之不理。如果置之不理,這個異常就會被拋給 b 的呼叫者,以此類推。
如果一層層的函式都不處理異常,異常最終會被拋給最外層的 main 函式。main 函式應該處理異常。如果main函式也不處理異常,那麼程式就會立即異常地中止。
c++ 通過 throw 語句和 try…catch 語句實現對異常的處理。throw 語句的語法如下:
throw 表示式;
該語句丟擲乙個異常。異常是乙個表示式,其值的型別可以是基本型別,也可以是類。
try…catch 語句的語法如下:
try
catch(異常型別)
...catch(異常型別)
catch 可以有多個,但至少要有乙個。
不妨把 try 和其後{}中的內容稱作「try塊」,把 catch 和其後{}中的內容稱作「catch塊」。
try…catch 語句的執行過程是:
● 執行 try 塊中的語句,如果執行的過程中沒有異常丟擲,那麼執行完後就執行最後乙個 catch 塊後面的語句,所有 catch 塊中的語句都不會被執行;
● 如果 try 塊執行的過程中丟擲了異常,那麼丟擲異常後立即跳轉到第乙個「異常型別」和丟擲的異常型別匹配的 catch 塊中執行(稱作異常被該 catch 塊「捕獲」),執行完後再跳轉到最後乙個 catch 塊後面繼續執行。
#include using namespace std;
int main()
catch(double d)
catch(int e)
cout << "finished" << endl;
return 0;
}
程式的執行結果如下:
輸入:9 6
輸出:before dividing.
1.5after dividing.
finished
說明當 n 不為 0 時,try 塊中不會丟擲異常。因此程式在 try 塊正常執行完後,越過所有的 catch 塊繼續執行,catch 塊乙個也不會執行。
程式的執行結果也可能如下:
輸入: 9 0
輸出:before dividing.
catch(int) -1
finished
說明當 n 為 0 時,try 塊中會丟擲乙個整型異常。丟擲異常後,try 塊立即停止執行。該整型異常會被型別匹配的第乙個 catch 塊捕獲,即進入catch(int e)塊執行,該 catch 塊執行完畢後,程式繼續往後執行,直到正常結束。
如果丟擲的異常沒有被 catch 塊捕獲,例如,將catch(int e),改為catch(char e),當輸入的 n 為 0 時,丟擲的整型異常就沒有 catch 塊能捕獲,這個異常也就得不到處理,那麼程式就會立即中止,try…catch 後面的內容都不會被執行。
如果希望不論丟擲哪種型別的異常都能捕獲,可以編寫如下 catch 塊:
catch(...)
這樣的 catch 塊能夠捕獲任何還沒有**獲的異常。例如下面的程式:
#include using namespace std;
int main()
catch (double d)
catch (...)
cout << "finished" << endl;
return 0;
}
程式的執行結果如下:
輸入:9 0
輸出:before dividing.
catch (…)
finished
當 n 為 0 時,丟擲的整型異常被catch(…)捕獲。
程式的執行結果也可能如下:
輸入: 0 6
輸出:before dividing.
catch (double) -1
finished
當 m 為 0 時,丟擲乙個 double 型別的異常。雖然catch (double)和catch(…)都能匹配該異常,但是catch(double)是第乙個能匹配的 catch 塊,因此會執行它,而不會執行catch(…)塊。
由於catch(…)能匹配任何型別的異常,它後面的 catch 塊實際上就不起作用,因此不要將它寫在其他 catch 塊前面。
c++ 標準庫中有一些類代表異常,這些類都是從 exception 類派生而來的。
bad_typeid、bad_cast、bad_alloc、ios_base::failure、out_of_range 都是 exception 類的派生類。c++ 程式在碰到某些異常時,即使程式中沒有寫 throw 語句,也會自動丟擲上述異常類的物件。這些異常類還都有名為 what 的成員函式,返回字串形式的異常描述資訊。使用這些異常類需要包含標頭檔案 stdexcept。
c 異常處理機制
c 異常處理機制 c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到...
c 異常處理機制
c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異...
C 異常處理機制
c 異常處理機制主要使用try,throw,catch三大關鍵字。try catch語句形式如下 require redcarpet markdown redcarpet.new hello world puts markdown.to htmltry catch exception1 ex 捕獲型...