C 11異常處理關鍵字 noexcept

2021-10-10 05:30:09 字數 2143 閱讀 3721

斷言(assertion)是一種程式設計中常用的手段。相比於斷言適用於排除邏輯上不可能存在的狀態,異常通常是用於邏輯上可能發生的錯誤。在c++98中,我們看到了一套完整的不同於c的異常處理系統。通過這套異常處理系統,c++擁有了遠比c強大的異常處理功能。下面來一起了解一下吧。

c++11開始,我們能看到很多**當中都有關鍵字noexcept。比如下面就是std::initializer_list的預設建構函式,其中使用了noexcept。

constexpr initializer_list() noexcept

: _m_array(0), _m_len(0)

該關鍵字告訴編譯器,函式中不會發生異常,這有利於編譯器對程式做更多的優化。

如果在執行時,noexecpt函式向外丟擲了異常(如果函式內部捕捉了異常並完成處理,這種情況不算丟擲異常),程式會直接終止,呼叫std::terminate()函式,該函式內部會呼叫std::abort()終止程式。

在異常處理的**中,程式設計師有可能看到過如下的異常宣告表達形式:

void excpt_func()throw(int,double)

在excpt_func函式宣告之後,我們定義了乙個動態異常宣告throw(int,double),該宣告指出了excpt_func可能丟擲的異常的型別。

事實上,該特性很少被使用,因此在c++11中被棄用了,而表示函式不會丟擲異常的動態異常宣告throw()也被新的noexcept異常宣告所取代。

noexcept形如其名地,表示其修飾的函式不會丟擲異常。

不過與throw()動態異常宣告不同的是,在c++11中如果noexcept修飾的函式丟擲了異常,編譯器可以選擇直接呼叫std::terminate()函式來終止程式的執行,這比基於異常機制的throw()在效率上會高一些。

這是因為異常機制會帶來一些額外開銷,比如函式丟擲異常,會導致函式棧被依次地展開(unwind),並依幀呼叫在本幀中已構造的自動變數的析構函式等。

從語法上講,noexcept修飾符有兩種形式,一種就是簡單地在函式宣告後加上noexcept關鍵字。比如:

void excpt_func()noexcept;

另外一種則可以接受乙個常量表示式作為引數,如下所示:

void excpt_func()noexcept(常量表示式);

常量表示式的結果會被轉換成乙個bool型別的值。該值為true,表示函式不會丟擲異常,反之,則有可能丟擲異常。這裡,不帶常量表示式的noexcept相當於宣告了noexcept(true),即不會丟擲異常。

在通常情況下,在c++11中使用noexcept可以有效地阻止異常的傳播與擴散。我們可以看看下面這個例子,如下面的**清單所示。

#include <iostream>

using namespace std;

void throw()

void noblockthrow()

void blockthrow()noexcept

int main()

catch(...)

trycatch(...)

trycatch(...)

}

//編譯選項:g++ -std=c++11 2-6-1.cpp

在上面的**清單中,我們定義了throw函式,該函式的唯一作用是丟擲乙個異常。而noblockthrow是乙個呼叫throw的普通函式,blockthrow則是乙個noexcept修飾的函式。

從main的執行中我們可以看到,noblockthrow會讓throw函式丟擲的異常繼續丟擲,直到main中的catch語句將其捕捉。而blockthrow則會直接呼叫std::terminate中斷程式的執行,從而阻止了異常的繼續傳播。從使用效果上看,這與c++98中的throw()是一樣的。

其實就這麼多東西。你用過的任何程式,不管多麼複雜,都是由上面這些基本功能組合而成的。所以我們也可以說,程式設計是將複雜的任務逐步分解為越來越小的子任務,直到問題解決,看完你學會了嗎?

c 11關鍵字剖析

1 auto 該關鍵字用於兩種情況 1.宣告變數時 根據初始化表示式自動推斷變數型別。2.宣告函式作為函式返回值的佔位符。2static static變數只初始化一次,除此之外它還有可見性的屬性 1.static修飾函式內的 區域性 變數時,表明它不需要在進入或離開函式時建立或銷毀。且僅在函式內可見...

C 11特性 decltype關鍵字

我們之前使用的typeid運算子來查詢乙個變數的型別,這種型別查詢在執行時進行。rtti機制為每乙個型別產生乙個type info型別的資料,而typeid查詢返回的變數相應type info資料,通過name成員函式返回型別的名稱。同時在c 11中typeid還提供了hash code這個成員函式...

C 11基礎 decltype關鍵字

1.decltype關鍵字獲取表示式的型別 int x 0 decltype x y 1 y int2.推導規則decltype exp int n 0 volatile const int x n decltype n a n a int decltype x b n b const volati...