您好,登錄后才能下訂單哦!
這篇文章主要介紹了c++異常如何處理,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
c++異常處理
程序運行時常會碰到一些異常情況,例如:做除法的時候除數為 0;用戶輸入年齡時輸入了一個負數;用 new 運算符動態分配空間時,空間不夠導致無法分配;訪問數組元素時,下標越界;打開文件讀取時,文件不存在等等。
這些異常情況,如果不能發現并加以處理,很可能會導致程序崩潰。
所謂“處理”,可以是給出錯誤提示信息,然后讓程序沿一條不會出錯的路徑繼續執行;也可能是不得不結束程序,但在結束前做一些必要的工作,如將內存中的數據寫入文件、關閉打開的文件、釋放動態分配的內存空間等。
C++ 引入了異常處理機制。其基本思想是:函數 A 在執行過程中發現異常時可以不加處理,而只是“拋出一個異常”給 A 的調用者,假定為函數 B。
拋出異常而不加處理會導致函數 A 立即中止,在這種情況下,函數 B 可以選擇捕獲 A 拋出的異常進行處理,也可以選擇置之不理。如果置之不理,這個異常就會被拋給 B 的調用者,以此類推。
如果一層層的函數都不處理異常,異常最終會被拋給最外層的 main 函數。main 函數應該處理異常。如果main函數也不處理異常,那么程序就會立即異常地中止。
C++異常處理基本語法
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 <iostream> using namespace std; int main() { double m ,n; cin >> m >> n; try { cout << "before dividing." << endl; if( n == 0) throw -1; //拋出int類型異常 else cout << m / n << endl; cout << "after dividing." << endl; } catch(double d) { cout << "catch(double) " << d << endl; } catch(int e) { cout << "catch(int) " << e << endl; } cout << "finished" << endl; return 0; }
程序的運行結果如下:
9 6↙ before dividing. 1.5 after 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 后面的內容都不會被執行。
感謝你能夠認真閱讀完這篇文章,希望小編分享c++異常如何處理內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。