C++ 中的異常處理要點
阿新 • • 發佈:2019-01-11
- catch 異常時,C++不會通過相關“轉換建構函式”來強行匹配,但可用父類匹配子類
- 在catch中儘量使用引用,以免出現“切割”及不必要的拷貝
- catch(...) 可以捕獲一切,{throw;}可以將異常再次丟擲
- 沒有catch可用時,或異常由解構函式丟擲時,系統呼叫terminate(), 進而呼叫abort()終止程式。可通過set_terminate()替換terminate函式
- 要確保建構函式不會丟擲異常,否則解構函式不會呼叫,資源也就得不到釋放
- 瞭解auto_prt, smart_ptr的使用
- “異常規格說明”可使函式呼叫者更直觀地知道應當處理的異常。
- void f() throw (Exception1, Exception2){}
- 也可確保無異常:void f() throw(){};
- 模板類並不使用此說明,因為例項類的行為尚未可知
- 當函式丟擲了不在列表中的異常時,預設呼叫unexpected() 函式,可使用set_unexpected設定行為
- 繼承來的方法不要在“異常規格說明”中新增新的異常型別(但可以使用已有異常的子類,總之保證相容針對父類異常規格寫的異常處理程式碼),要確保“is-a”原則的落實。
- 異常會增加開銷,請只在異常情況下使用
- 儘量使用系統提供的異常類,或繼承之
- subclasses of logic_error
- domain_error, invalid_argument, length_error, out_of_range, bad_cast, bad_typeid
- subclasses of runtime_error
- range_error, overflow_error, bad_alloc
- subclasses of logic_error