1. 程式人生 > >C++ 中的異常處理要點

C++ 中的異常處理要點

  • 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