標籤:har clu 自訂 基本 ons 獲得 復原 節奏 指標
一、什麼是異常
能預見但無法避免的錯誤。
二、如何拋出異常
throw 資料:
a、可以拋出基本類型的異常
throw -1;
throw "我是異常"
b、可以拋出類類型的異常
throw Student stu;
注意:不要拋出局部對象的指標的異常
注意:如果拋出了異常程式沒有捕獲,程式會死亡
三、如何捕獲異常
try{
//可能會產生錯誤的代碼
}
catch(資料類型1)
{
//異常處理代碼1
}
catch(資料類型2)
{
//異常處理代碼2
}
a、在捕獲異常時不光能獲得異常,還能獲得拋出的資料
throw "我是異常";
catch (const char* str);
b、異常的捕獲是自上而下的,不是選擇最優,子類的異常捕獲最好放在父類前面
A a;
throw a;
catch(A);
c、捕獲異常時盡量使用引用的方式,在拋出異常時如果使用對象的方式來捕獲就會調用拷貝構造,這樣就會在拷貝對象的過程中再次引用引發異常的代碼
四、類類型的異常
a、可以為每一種異常定義一個什麼都不用做的類,他只是為了區分各種異常
b、在拋出異常的時候可能會調用異常的構造、拷貝構造、賦值構造等,如果在類中有看不到的資源,一定要把這三個函數實現
c、為了防止有自訂的異常無法被捕獲,因此在定義異常類時,最後都繼承標準庫的異常類,這樣哪怕不能精準捕獲異常,也能不遺漏異常
#include <stdexcept>
五、關於異常
1、編譯器會產生一段用來申請"安全區"的代碼並保護他,在異常發生後,此時程式的節奏已經被打斷了,除了安全區,沒有任何位置是安全的,安全區能保證儲存在此位置的異常對象不受破壞
2、在建構函式中發生了異常後,會直接跳轉到異常處理代碼,異常的構造就此中斷,對此昂的構造就不完整了,不完整的對象就永遠不可能調用解構函式,哪怕用dekete顯式調用
3、在建構函式中的異常也可以拋,但是不要拋出建構函式,一般使用復原機制
C++異常處理