C++中的throw和catch怎么用?有什么作用?

C++中的throw和catch怎么用?有什么作用?

c++中,throwcatch 是異常處理機制的重要組成部分。它們的作用是讓程序在運行時遇到錯誤時,能夠跳過正常流程,轉(zhuǎn)而執(zhí)行專門的錯誤處理代碼。


基本用法:throw拋出異常

throw 用來拋出一個異常。它可以拋出任何類型的值(比如 int、String、自定義類等),但通常會使用標準庫中的異常類,例如 std::runtime_error。

#include <stdexcept> #include <iostream>  void divide(int a, int b) {     if (b == 0) {         throw std::runtime_error("除數(shù)不能為零");     }     std::cout << a / b << std::endl; }

上面的例子中,如果 b == 0,函數(shù)就會拋出一個帶有錯誤信息的異常。這個異常需要被“捕獲”才能避免程序崩潰。


捕獲異常:catch塊怎么寫

catch 負責捕獲由 throw 拋出的異常。它必須緊跟在 try 塊后面。你可以根據(jù)拋出的類型來匹配對應(yīng)的 catch 塊。

立即學(xué)習(xí)C++免費學(xué)習(xí)筆記(深入)”;

try {     divide(10, 0); } catch (const std::runtime_error& e) {     std::cerr << "捕獲到異常:" << e.what() << std::endl; }

幾個關(guān)鍵點:

  • catch(…) 可以捕獲所有類型的異常,但不推薦濫用,因為它無法獲取錯誤信息。
  • 推薦按引用捕獲(如 const std::exception& e),避免拷貝和對象切片問題。
  • 多個 catch 塊可以并列,順序很重要,更具體的異常類型應(yīng)該放在前面。

異常處理的實際作用

異常處理的核心作用是分離“正常邏輯”和“錯誤處理邏輯”。這樣做的好處包括:

  • 提高代碼可讀性:不需要在每個函數(shù)里都檢查返回碼。
  • 集中式錯誤處理:可以在調(diào)用鏈上層統(tǒng)一處理錯誤。
  • 更安全的資源管理:結(jié)合 RaiI(資源獲取即初始化)模式能有效避免資源泄漏。

舉個實際場景:

你正在寫一個文件解析器,讀取文件、解析內(nèi)容、進行計算。這三個步驟任何一個出錯都應(yīng)該終止流程,并提示用戶。使用異??梢宰屵@三步的錯誤統(tǒng)一處理,而不是層層判斷返回值。


使用時需要注意的地方

雖然異常處理很強大,但也有一些容易踩坑的地方:

  • 不要輕易拋出裸指針:拋出的對象最好是一個臨時變量或引用,否則容易造成內(nèi)存泄漏。
  • 不是所有項目都鼓勵使用異常:有些項目出于性能或風(fēng)格考慮禁用了 C++ 異常(比如 Google 的編碼規(guī)范)。
  • 避免在析構(gòu)函數(shù)中拋出異常:可能會導(dǎo)致未定義行為,因為此時可能已經(jīng)有異常在傳播。

基本上就這些。throw 和 catch 看起來簡單,但在大型項目中合理使用還是需要經(jīng)驗積累。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊5 分享