程式執行時常會碰到一些異常情況,例如:
這些異常情況,如果不能發現並加以處理,很可能會導致程式崩潰。
所謂「處理」,可以是給出錯誤提示資訊,然後讓程式沿一條不會出錯的路徑繼續執行;也可能是不得不結束程式,但在結束前做一些必要的工作,如將記憶體中的資料寫入檔案、關閉開啟的檔案、釋放動態分配的記憶體空間等。
一發現異常情況就立即處理未必妥當,因為在乙個函式執行過程中發生的異常,在有的情況下由該函式的呼叫者決定如何處理更加合適。尤其像庫函式這類提供給程式設計師呼叫,用以完成與具體應用無關的通用功能的函式,執行過程中貿然對異常進行處理,未必符合呼叫它的程式的需要。
此外,將異常分散在各處進行處理不利於**的維護,尤其是對於在不同地方發生的同一種異常,都要編寫相同的處理**也是一種不必要的重複和冗餘。如果能在發生各種異常時讓程式都執行到同乙個地方,這個地方能夠對異常進行集中處理,則程式就會更容易編寫、維護。
鑑於上述原因,c++ 引入了異常處理機制。其基本思想是:
函式 a 在執行過程中發現異常時可以不加處理,而只是「丟擲乙個異常」給 a 的呼叫者(假定為函式 b),然後 a 立即中止;在這種情況下,函式 b 可以選擇捕獲 a 丟擲的異常進行處理,也可以選擇置之不理。如果置之不理,這個異常就會被拋給 b 的呼叫者,以此類推。如果一層層的函式都不處理異常,異常最終會被拋給最外層的 main 函式。如果main函式也不處理異常,那麼程式就會立即中止。
要處理異常,就需要捕獲異常。c++ 通過try...catch
語句實現對異常的捕獲和處理。
try
catch
(異常型別)..
.catch
(異常型別)
// catch 可以有多個,但至少要有乙個
try…catch 語句的執行過程是:
除了c++執行時等底層自身丟擲異常外,也可以通過throw
主動丟擲異常。
throw 表示式;
// 表示式的值可以是基本型別,也可以是類
c++ 標準庫中有一些類代表異常,這些類都是從 exception 類派生而來的。常用的幾個異常類如下所示。
c++ 程式在碰到某些異常時,即使程式中沒有寫 throw 語句,也會自動丟擲上述異常類的物件。這些異常類還都有名為what()
的成員函式,返回字串形式的異常描述資訊。使用這些異常類需要包含標頭檔案。
#include
trycatch
(std::exception & e)
#include
trycatch
(std::bad_cast & e)
#include
trycatch
(std::string & e)
catch
(int
& e)
注意:這種throw
丟擲的是基本型別,不能使用std::exception
類來捕獲。
try
catch(...)
#include
#include
using
namespace std;
struct myexception :
public exception};
intmain()
catch
(myexception& e)
catch
(std::exception& e)
}
C 異常處理 C 基礎
1 using system 2using system.collections.generic 3using system.linq 4using system.text 5using system.threading.tasks 67 namespace 異常處理815 catch 1617 c...
C 處理異常 基礎一
c 處理異常的機制引入 在乙個小的程式中,可以用比較簡單的方法處理異常,例如用if語句判別除數是否為0,如果是。則輸出乙個出錯資訊。但是在乙個大的系統中,包含許多模組,每個模組義包含許多函式,函式之間又五相呼叫,比較複雜。如果在每乙個函式中都設定處理異常的程式段,會使程式過於複雜和龐大。因此,c 採...
C 超基礎 異常處理
1.什麼是異常?異常就是在程式的執行過程中所發生的不正常的事件,它會中斷正在執行的程式。2.異常處理是通過4個關鍵字來實現的 try catch 捕獲 finally throw 丟擲 3.使用try catch捕獲異常,如果在try catch語句塊後加入finally塊,可以確保無論是否發生異常...