【C++基础】C++11的noexcept声明符 与 异常传播
目錄
- C++ noexcept:
- 1、用途
- 2、用法
- 1、noexcept聲明符的用法:
- 2、noexcept運(yùn)算符的用法
- 異常傳播
- 1、異常傳播的定義
- 2、異常傳播中的規(guī)則
- 3、異常傳播的代價(jià)
C++ noexcept:
1、用途
C++11使用noexcept指明函數(shù)是否拋出異常:
若函數(shù)不拋異常,則可做編譯優(yōu)化
即便函數(shù)拋異常,也不再說明所拋異常類型(簡化)
注意,C++03將throw(ExceptionType)放到函數(shù)后面,說明函數(shù)會(huì)拋出什么類型的異常,也被稱為“異常規(guī)約”
java用 throws關(guān)鍵字做同樣的事情
2、用法
1、noexcept聲明符的用法:
void foo() noexcept {} //函數(shù)不拋異常void foo() noexcept(true) {} // noexcept(true)等價(jià)于noexceptvoid foo() {} // 可能會(huì)拋出異常void foo() noexcept(false) {} // noexcept(false)等價(jià)于什么也不寫,可能會(huì)拋出異常需要注意的地方:
1、noexcept不能用于區(qū)分重載函數(shù)。
2、如果我們聲明函數(shù)時(shí)說了它不拋異常,但是又在noexcept函數(shù)中拋出異常,這就等于調(diào)用std::terminate(),終結(jié)程序的運(yùn)行。
void f() { /* 潛在拋出異常 */ } void g() noexcept {f(); // 合法,即 使 f 拋出 throw 42; // 合法,等效于調(diào)用 std::terminate }
編譯時(shí)會(huì)報(bào)警告:
主函數(shù)調(diào)用foo(),運(yùn)行時(shí)程序會(huì)終止:
2、noexcept運(yùn)算符的用法
bool noexcept( expression )noexcept 運(yùn)算符進(jìn)行編譯時(shí)檢查,若表達(dá)式聲明為不拋出任何異常則返回 true。
noexcept (may_throw())返回false,表明可能會(huì)拋異常。
noexcept (no_throw())返回true,表明不拋異常。
異常傳播
1、異常傳播的定義
嵌套的函數(shù)調(diào)用,每個(gè)函數(shù)中都有 try-catch 塊,內(nèi)層函數(shù)拋出異常,這時(shí)候會(huì)出現(xiàn)異常傳播
如圖,func3中出現(xiàn)了異常,如果沒有被func2中的catch捕獲到的話,異常會(huì)隨著函數(shù)的返回,交給函數(shù)的上一級(func1)處理,如果func1也處理不了,則交給main函數(shù)處理,如果main函數(shù)處理不了,程序會(huì)崩潰。
需要注意的地方:
2、異常傳播中的規(guī)則
try-catch的執(zhí)行規(guī)則
仍然以上圖調(diào)用鏈為例:
Quiz: function3拋出
執(zhí)行Process ex3 -> statement6-> statement3-> statement4-> statement1-> statement2;
執(zhí)行Process ex2 ->statement4-> statement1-> statement2;
執(zhí)行Process ex1 -> statement2;
返回到主函數(shù),程序崩潰
3、異常傳播的代價(jià)
C++引入的異常處理會(huì)為程序帶來額外開銷和代價(jià)。
(1)項(xiàng)目中使用異常,需要考慮與未使用異常的第三方和舊項(xiàng)目代碼的整合問題,避免出現(xiàn)一異常安全問題;
(2)異常使用不當(dāng),容易造成內(nèi)存泄漏和程序崩潰,比如函數(shù)內(nèi)拋出異常需要注意棧展開導(dǎo)致的內(nèi)存泄露,析構(gòu)函數(shù)拋出異常將程序置于不確定狀態(tài)等;
(3)異常的跳轉(zhuǎn)會(huì)徹底擾亂程序的執(zhí)行流程并難以判斷,給代碼調(diào)試和維護(hù)增加難度;
(4)為保證寫出異常安全的代碼,往往需要借用C++其它特性,如智能指針,這又進(jìn)一步加劇了代碼可讀性的惡化與程序的時(shí)空開銷,包括編譯時(shí)間的延長,運(yùn)行效率的較低以及代碼尺寸的增大。
總結(jié)
以上是生活随笔為你收集整理的【C++基础】C++11的noexcept声明符 与 异常传播的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《蜀四贤咏》第五句是什么
- 下一篇: 【C++基础】重抛异常与异常的使用场景