了解C++編程中指定的異常和未經(jīng)處理的異常
noexcept
C++11:指定函數(shù)是否可能會引發(fā)異常。
語法
ReturnType FunctionName(params) noexcept; ReturnType FunctionName(params) noexcept(noexcept(expression);
參數(shù)
表達式
計算結(jié)果是 True 或 False 的常量表達式。無條件版本相當(dāng)于 noexcept(true)。
備注
noexcept(及其同義詞 noecept(true))指定函數(shù)絕不會引發(fā)異常,或允許從異常直接或間接調(diào)用的任何其他函數(shù)傳播異常。更具體地說,noexcept 意味著,僅當(dāng)調(diào)用的所有函數(shù)也為 noexcept 或 const 并且沒有要求運行時檢查、應(yīng)用于類型為多態(tài)類類型的 glvalue 表達式的 typeid 表達式或 throw 表達式的潛在已評估轉(zhuǎn)換時,該函數(shù)才是 noexcept。但是,編譯器不一定會檢查可能歸因于 noexcept 函數(shù)的異常的每個代碼路徑。如果異常確實到達標(biāo)記為 noexcept 的函數(shù),則會立即調(diào)用 std::terminate,并且不會保證將調(diào)用任何范圍內(nèi)對象的析構(gòu)函數(shù)。
使用條件 noexcept 聲明的且計算結(jié)果為 noexcept(false) 的函數(shù)指定它確實允許傳播異常。例如,當(dāng)要復(fù)制的對象是普通的舊數(shù)據(jù)類型 (POD) 時,可將復(fù)制其參數(shù)的函數(shù)聲明為 noexcept。此類函數(shù)可以如下聲明:
#include <type_traits> template <typename T> T copy_object(T& obj) noexcept(std::is_pod<T>) { //. . . }
使用 noexcept 代替異常說明符 throw,后者在 C++11 和更高版本中已棄用。當(dāng)你確信函數(shù)絕不允許異常傳播到調(diào)用堆棧時,我們建議你將 noexcept 應(yīng)用到函數(shù)。使用 noexcept 聲明的函數(shù)使編譯器可以在多種不同的上下文中生成更高效的代碼。
未經(jīng)處理的 C++ 異常
如果無法找到當(dāng)前異常的匹配處理程序(或省略號 catch 處理程序),則調(diào)用預(yù)定義的 terminate 運行時函數(shù)。(您也可以在任意處理程序中顯式調(diào)用 terminate。)terminate 的默認操作是調(diào)用 abort。如果您希望 terminate 在退出應(yīng)用程序之前調(diào)用程序中的某些其他函數(shù),則用被調(diào)用函數(shù)的名稱作為其單個參數(shù)調(diào)用 set_terminate 函數(shù)。您可以在程序的任何點調(diào)用 set_terminate。 terminate 例程總是調(diào)用指定為 set_terminate 的參數(shù)的最后一個函數(shù)。
以下示例引發(fā) char * 異常,但不包含用于捕獲類型 char * 的異常的指定處理程序。對 set_terminate 的調(diào)用指示 terminate 調(diào)用 term_func。
// exceptions_Unhandled_Exceptions.cpp // compile with: /EHsc #include <iostream> using namespace std; void term_func() { cout << "term_func was called by terminate." << endl; exit( -1 ); } int main() { try { set_terminate( term_func ); throw "Out of memory!"; // No catch handler for this exception } catch( int ) { cout << "Integer exception raised." << endl; } return 0; }
輸出:
term_func was called by terminate.
term_func 函數(shù)最好是通過調(diào)用 exit 來終止程序或當(dāng)前線程。如果它沒有這樣做,而是返回到其調(diào)用方,則調(diào)用 abort。
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載