拋出 → 檢測 → 捕獲 throw → try → catch
try {
// 可能拋出異常的代碼
} catch (ExceptionType& e) {
// 處理異常
}
try 區塊:監測異常拋出catch 區塊:匹配類型並處理try 無異常拋出,catch 不執行string s = "abc"; char c1 = s[100]; // 未檢查,Undefined Behavior,程式可能崩潰 char c2 = s.at(100); // 檢查越界,拋出 out_of_range 異常
at() 拋出異常,[] 不拋出。無拋出 = 無捕獲,即使有錯誤 try 也檢測不到。
string s = "https://c.biancheng.net";
try {
char c = s.at(100); // 拋出 out_of_range
} catch (exception& e) { // 捕獲所有標準異常
cout << "[2] out of bound!" << endl;
}
執行流直接跳轉到 catch,拋出點之後的 try 區塊代碼永不執行。catch 結束後,程式繼續執行 catch 之後的代碼。
void inner() { throw "error"; }
void outer() { inner(); cout << "outer after"; } // 不執行
int main() {
try { outer(); cout << "main after"; } // 不執行
catch (const char* e) { cout << e; } // 輸出 error
}
異常沿呼叫鏈向上傳播,中間函數未捕獲則自動穿透,未執行代碼全部跳過。
try {
throw "Unknown Exception"; // 手動拋出字串字面值
} catch (const char* e) {
cout << e; // Unknown Exception
}
長期熬夜寫代碼易誘發神經衰弱、失眠。程序員請注意勞逸結合、多運動、陪伴家人,身體是革命本錢。
異常機制給程式「起死回生」機會:顯式拋出 → try 檢測 → catch 處理 → 繼續執行。掌握「必須拋出才能捕獲」「傳播穿透呼叫鏈」「執行流跳轉不返回」三大核心行為,即可從容應對執行期錯誤。