了解C++編程中指定的異常和未經(jīng)處理的異常
noexcept
C++11:指定函數(shù)是否可能會(huì)引發(fā)異常。
語(yǔ)法
ReturnType FunctionName(params) noexcept; ReturnType FunctionName(params) noexcept(noexcept(expression);
參數(shù)
表達(dá)式
計(jì)算結(jié)果是 True 或 False 的常量表達(dá)式。無(wú)條件版本相當(dāng)于 noexcept(true)。
備注
noexcept(及其同義詞 noecept(true))指定函數(shù)絕不會(huì)引發(fā)異常,或允許從異常直接或間接調(diào)用的任何其他函數(shù)傳播異常。更具體地說(shuō),noexcept 意味著,僅當(dāng)調(diào)用的所有函數(shù)也為 noexcept 或 const 并且沒(méi)有要求運(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 代替異常說(shuō)明符 throw,后者在 C++11 和更高版本中已棄用。當(dāng)你確信函數(shù)絕不允許異常傳播到調(diào)用堆棧時(shí),我們建議你將 noexcept 應(yīng)用到函數(shù)。使用 noexcept 聲明的函數(shù)使編譯器可以在多種不同的上下文中生成更高效的代碼。
未經(jīng)處理的 C++ 異常
如果無(wú)法找到當(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ù)最好是通過(guò)調(diào)用 exit 來(lái)終止程序或當(dāng)前線程。如果它沒(méi)有這樣做,而是返回到其調(diào)用方,則調(diào)用 abort。
欄 目:C語(yǔ)言
本文標(biāo)題:了解C++編程中指定的異常和未經(jīng)處理的異常
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2520.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點(diǎn)數(shù)在內(nèi)存中的存儲(chǔ)方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載


