catch 參數解析
catch (ExceptionType variable) // variable 可省略,僅匹配類型
// 相當於函數參數:運行期匹配,而非編譯期檢查
ExceptionType:可為基本型別、指標、陣列、類別等任意型別
- 標準庫異常皆繼承
std::exception
- 以引用捕獲避免切割與拷貝
多重 catch 匹配順序:從上到下,第一個匹配生效
try { throw Derived(); }
catch (int) { ... }
catch (char*) { ... }
catch (Base) { ... } // ← 匹配成功!向上轉型
catch (Derived) { ... } // 永不執行
關鍵:catch(Base) 捕獲 Derived 異常 → 向上轉型 發生在匹配階段。
catch 允許的類型轉換 (受限)
| 轉換類型 | 範例 | 說明 |
| 向上轉型 | Derived → Base | 公開繼承,保留多態 |
| const 轉換 | int* → const int* | 增加 const 資格 |
| 陣列/函數退化 | int[3] → int* | 非引用參數自動退化 |
禁止:算術轉換 (int→float)、使用者定義轉換、const_cast/reinterpret_cast 等。
實戰演示:陣列退化 + const 轉換
int nums[] = {1,2,3};
throw nums; // 型別 int[3]
catch (const int*) { ... } // 匹配:int[3] → int* → const int*
捕獲順序黃金法則
- 派生類在前,基類在後:否則基類攔截所有派生異常
- 具體異常在前,通用異常在後:
bad_alloc 前於 exception
- 參考捕獲:
catch (const ExceptionType& e)
- 兜底捕獲:
catch (...) 放最後,記錄未知異常並重拋或安全退出
異常物件生命週期
- 拋出時建立臨時物件 (複製/移動語意)
- 捕獲引用參數綁定至該臨時物件
catch 區塊結束時銷毀
throw; 重拋時保留原物件 (不再複製)
總結
理解 匹配順序優先、向上轉型可匹配、轉換規則受限** 三大核心機制,配合「派生前基後、具體前通用後、引用捕獲、兜底處理」四大鐵律,即能構建精準、高效、可維護的異常處理網。
- 上一篇文章: C++ throw 關鍵字深度解析:拋出異常與棄用的異常規範
- 下一篇文章: C++ 異常處理入門:try-catch 機制、拋出傳播與錯誤分類
Copyright ©
程式碼之家 All Rights Reserved