跳至內容

C++/exception

維基教科書,自由的教學讀本
< C++

<exception>頭文件在STL中,定義了標準的異常類。

exception_ptr 在標準中是未定義具體實現的,因此它可能是類也可能是類型。

[編輯]

函數[編輯]

uncaught_exception() 和 uncaught_exceptions() 是兩個不同的函數,分別 判斷是否有未處理異常、返回未處理異常的個數 。 其中,uncaught_exceptions()函數僅在C++14開始出現。

類(模板)[編輯]

未捕獲異常處理[編輯]

分為兩類:

  • 當拋出的異常未被catch塊捕獲時,標準庫的terminate()函數會被自動調用,默認情況下該函數調用abort()函數非正常終止程序。非正常終止不會析構任何對象,也不會調用任何通過atexit 或者 at_quick_exit註冊的處理函數。標準庫提供了set_terminate()、get_terminate()來幫助用戶獲取和設置處理器做一些必要的清理工作 、讓用戶來決定是否終止程序。
  • dynamic-exception-specification(C++11中已廢棄)。函數簽名中還可以指定拋出的異常類型,例如:
void function() throw(int)  {...}

如果該function函數拋出了任何非int異常類型,unexpected()函數也會被自動調用。 為此,C++標準甚至特地規定了一個bad_exception異常類來表示這種情況。 我們把這類情況也稱為未捕獲,該函數默認調用terminate()函數

異常嵌套[編輯]

標準庫提供了三個: nested_exception異常類 、throw_with_nested函數 、rethrow_if_nested函數。異常類nested_exception非常特殊,沒有繼承自通用的異常基類exception。 標準指出,該類是為了繼承之用,以配合其它兩個函數實現嵌套異常機制。

template <class T> noreturn void throw_with_nested(T&& t);

該函數將當前異常類(正在處理的異常類)與傳入類型構造成一個嵌套類型, 當前異常類為nested-exception,傳入類型為outer-exception。

使用函數解嵌套並重拋,如果傳入異常類型為嵌套異常,該函數會拋出被嵌套的異常:

template <class E> void rethrow_if_nested(const E& e);

異常重拋[編輯]

重拋函數需要經過一次類型轉換(通過make_exception_ptr()函數):

void rethrow_exception(exception_ptr p);