1. 程式人生 > 實用技巧 >C++之throw以及try{}...catch{}【轉載】

C++之throw以及try{}...catch{}【轉載】

程式執行時常會碰到一些異常情況,例如:

  • 做除法的時候除數為 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 塊後面繼續執行。