try {
// 可能拋出標準異常
} catch (exception& e) { // 以引用捕獲,避免物件切割與拷貝開銷
// e.what() 取得錯誤描述字串
}
exception 定義於 <exception>,為所有標準異常基類。
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw(); // 關鍵:回傳錯誤描述
};
what() 回傳字串格式由編譯器實作定義,僅供參考,不可依賴特定格式。
exception ├── logic_error (邏輯錯誤,理論上可預防) │ ├── length_error (超過最大長度,如 vector::resize) │ ├── domain_error (數學定義域錯誤,如 sqrt(-1)) │ ├── out_of_range (超出有效範圍,如 vector::at) │ └── invalid_argument (參數不合法,如 string 建構 bitset 含非 0/1) ├── runtime_error (執行期錯誤,難預防) │ ├── range_error (計算結果超出有意義範圍) │ ├── overflow_error (算術上溢) │ └── underflow_error (算術下溢) ├── bad_alloc (new/new[] 記憶體配置失敗) ├── bad_typeid (typeid 作用於帶虛函式類別的 null 指標) ├── bad_cast (dynamic_cast 參考轉型失敗) ├── ios_base::failure (I/O 操作失敗) └── bad_exception (特殊:異常規范違例時的替身)
try {
// 代碼
} catch (const bad_alloc& e) {
// 專門處理記憶體不足
} catch (const logic_error& e) {
// 統一處理邏輯錯誤族群
} catch (const exception& e) {
// 兜底:捕獲所有其他標準異常
} catch (...) {
// 捕獲非標準異常 (C 風格、作業系統信號等)
}
what() 僅供診斷,勿用於邏輯判斷out_of_range、length_error、invalid_argumentbad_alloc 記得處理,否則預設終止程式掌握 exception 繼承體系,能實現「精準捕獲已知異常、分層處理同類錯誤、兜底不漏異常」的健壯異常處理架構,是 C++ 專業級錯誤處理的基石。