了解C++編程中指定的異常和未經(jīng)處理的異常
noexcept
C++11:指定函數(shù)是否可能會(huì)引發(fā)異常。
語法
ReturnType FunctionName(params) noexcept; ReturnType FunctionName(params) noexcept(noexcept(expression);
參數(shù)
表達(dá)式
計(jì)算結(jié)果是 True 或 False 的常量表達(dá)式。無條件版本相當(dāng)于 noexcept(true)。
備注
noexcept(及其同義詞 noecept(true))指定函數(shù)絕不會(huì)引發(fā)異常,或允許從異常直接或間接調(diào)用的任何其他函數(shù)傳播異常。更具體地說,noexcept 意味著,僅當(dāng)調(diào)用的所有函數(shù)也為 noexcept 或 const 并且沒有要求運(yùn)行時(shí)檢查、應(yīng)用于類型為多態(tài)類類型的 glvalue 表達(dá)式的 typeid 表達(dá)式或 throw 表達(dá)式的潛在已評(píng)估轉(zhuǎn)換時(shí),該函數(shù)才是 noexcept。但是,編譯器不一定會(huì)檢查可能歸因于 noexcept 函數(shù)的異常的每個(gè)代碼路徑。如果異常確實(shí)到達(dá)標(biāo)記為 noexcept 的函數(shù),則會(huì)立即調(diào)用 std::terminate,并且不會(huì)保證將調(diào)用任何范圍內(nèi)對(duì)象的析構(gòu)函數(shù)。
使用條件 noexcept 聲明的且計(jì)算結(jié)果為 noexcept(false) 的函數(shù)指定它確實(shí)允許傳播異常。例如,當(dāng)要復(fù)制的對(duì)象是普通的舊數(shù)據(jù)類型 (POD) 時(shí),可將復(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)用堆棧時(shí),我們建議你將 noexcept 應(yīng)用到函數(shù)。使用 noexcept 聲明的函數(shù)使編譯器可以在多種不同的上下文中生成更高效的代碼。
未經(jīng)處理的 C++ 異常
如果無法找到當(dāng)前異常的匹配處理程序(或省略號(hào) catch 處理程序),則調(diào)用預(yù)定義的 terminate 運(yùn)行時(shí)函數(shù)。(您也可以在任意處理程序中顯式調(diào)用 terminate。)terminate 的默認(rèn)操作是調(diào)用 abort。如果您希望 terminate 在退出應(yīng)用程序之前調(diào)用程序中的某些其他函數(shù),則用被調(diào)用函數(shù)的名稱作為其單個(gè)參數(shù)調(diào)用 set_terminate 函數(shù)。您可以在程序的任何點(diǎn)調(diào)用 set_terminate。 terminate 例程總是調(diào)用指定為 set_terminate 的參數(shù)的最后一個(gè)函數(shù)。
以下示例引發(fā) char * 異常,但不包含用于捕獲類型 char * 的異常的指定處理程序。對(duì) 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。
相關(guān)文章
C/C++ Qt TreeWidget 嵌套節(jié)點(diǎn)操作使用
本文主要介紹了TreeWidget的如何使用,實(shí)現(xiàn)對(duì)樹形框多節(jié)點(diǎn)的各種操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Mingw64編譯wxWidgets 3.0.2常見錯(cuò)誤分析
這篇文章主要介紹了Mingw64編譯wxWidgets 3.0.2常見錯(cuò)誤分析,需要的朋友可以參考下2016-11-11基于QT實(shí)現(xiàn)顯示OpenCV讀取的圖片
OpenCV自帶了一部分常用的GUI功能,但是更多的圖像處理功能需要其他GUI框架來輔助實(shí)現(xiàn),本文將通過QT來顯示OpenCV讀取的圖片,需要的可以參考一下2022-11-11基于C++浮點(diǎn)數(shù)(float、double)類型數(shù)據(jù)比較與轉(zhuǎn)換的詳解
本篇文章是對(duì)C++中浮點(diǎn)數(shù)(float、double)類型數(shù)據(jù)比較與轉(zhuǎn)換進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ OpenCV實(shí)戰(zhàn)之圖像透視矯正
這篇文章主要介紹了通過C++ OpenCV實(shí)現(xiàn)圖像的透視矯正,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的可以了解一下2022-01-01C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼
這篇文章介紹了C++ 十進(jìn)制轉(zhuǎn)換為二進(jìn)制的實(shí)例代碼,有需要的朋友可以參考一下2013-10-10C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了C語言運(yùn)用函數(shù)指針數(shù)組實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式
這篇文章主要介紹了C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08C++數(shù)據(jù)結(jié)構(gòu)二叉搜索樹的實(shí)現(xiàn)應(yīng)用與分析
從這篇博客開始,我就要和大家介紹有關(guān)二叉搜索樹的知識(shí),它還衍生出了兩棵樹——AVL樹和紅黑樹,在后面兩篇博客我都會(huì)介紹。今天先從二叉搜索樹開始引入2022-02-02