1. 程式人生 > >C++11新特性(77)-noexcept異常指示符(Exception Specifier)

C++11新特性(77)-noexcept異常指示符(Exception Specifier)

C++異常處理

異常處理(exception handing)使問題的檢測和處理過程可以分別進行,是C++適用於大規模開發的重要語言特性之一。首先進行簡單說明。

首先假設我們有丟擲某種Error的函式testfun()。

 

注意:C++並不要求丟擲的物件一定是exception,Error可以是任意型別。

對於這個錯誤,程式碼如果不進行處理,一旦testfun被呼叫,程式會中止併產生以下輸出:

哪怕稍微正經一些的軟體,都不會接受這種結果的。所以一般的選擇是處理這個錯誤,也就是使用try/catch機制來捕捉錯誤。

testfun2,testfun3都在內部呼叫了testfun,區別就在於testfun2內部進行了錯誤捕捉;testfun3本身沒有進行錯誤捕捉,而是由main函式進行了錯誤捕捉。兩種方式都沒有問題。更加通用的說法是:

 

程式可以在處理的任何層級進行錯誤捕捉,如果所有的層級都沒有進行錯誤捕捉,程式會在錯誤發生時中止。

 

noexcept異常指示符

上述方法帶來靈活性的另一個側面就是同時也帶來了不確定性。軟體開發的規模越來越大,函式庫/類庫的呼叫層級也越來越多,這時確定一個呼叫是否會丟擲異常也 變得越來越困難。作為解決手段之一,C++11中通過noexcept說明符來對外宣稱處理不會丟擲異常。這樣程式設計師就不必深入所有的呼叫層級自己去確認 了。

 

例如上面的testfun2(),在它的內部已經進行了錯誤捕捉,可以按如下方式定義:

這樣使用者就可以放心大膽的不進行錯誤捕捉了。

 

例外

一個例外情況就是明明聲明瞭某個處理是noexcept,實際的內部處理還是丟擲了異常。在這種情況下,即使進行了錯誤捕捉,也不會正常工作。

上述程式碼中testfun4()如果宣告為noexcept的同時又丟擲了異常,即使main函式中try/catch無法捕捉到Error。如果去掉noexcpt宣告,則main函式中錯誤捕捉程式碼可以正常工作。

一旦宣告某個處理是noexcept,編譯器在處理這部分程式碼的時候似乎也會省略錯誤傳遞的那部分功能。

 

作者一句話

實事求是真的很重要。

 

示例程式碼下載地址

https://github.com/xueweiguo/OOThinking/blob/master/20180520%20NoExceptExceptionSpecifier.cpp

 

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】