天天看點

c++ try catch語句_教你一招搞定try,catch,finally的執行順序

在面試的時候,經常會問到一些很基礎的知識,比如有沒接觸過try,catch,finally?他們的執行順序是怎麼樣的呢?你對此嗤之以鼻,這不是很簡單嗎?按照順序執就行了。沒錯,可是如果每一塊有return,并且有抛異常,撲捉異常的情況呢?估計很多 人都答不上來。下面我列出try,catch,finally的各種情況,然後總結一招搞定try,catch,finally的執行順序。

c++ try catch語句_教你一招搞定try,catch,finally的執行順序

舉例:

  • 情況1: try{} catch(){}finally{} return;

顯然程式按順序執行。

  • 情況2: try{ return; }catch(){} finally{} return;

先執行try塊中return 語句(包括return語句中的表達式運算),但不傳回;

執行finally語句中全部代碼

最後執行try中return 傳回

finally塊之後的語句return不執行,因為程式在try中已經return。

  • 情況3: try{ } catch(){return;} finally{} return;

1、程式先執行try,如果遇到異常執行catch塊,

有異常:

執行catch中return語句,但不傳回

執行finally語句中全部代碼,

最後執行catch塊中return傳回。 finally塊後的return語句不再執行。

無異常:

執行完try再finally再return…

  • 情況4: try{ return; }catch(){} finally{return;}

執行try塊return語句(包括return語句中的表達式運算),但不傳回;

再執行finally塊,

執行finally塊,有return,從這裡傳回。

此時finally塊的return值,就是代碼執行完後的值

c++ try catch語句_教你一招搞定try,catch,finally的執行順序
  • 情況5: try{} catch(){return;}finally{return;}

程式執行catch塊中return語句(包括return語句中的表達式運算),但不傳回;

再執行finally塊,執行finally塊,有return,從這裡傳回。

  • 情況6: try{ return;}catch(){return;} finally{return;}

1、程式執行try塊中return語句(包括return語句中的表達式運算),但不傳回;

有異常:

執行catch塊中return語句(包括return語句中的表達式運算),但不傳回;

再執行finally塊

執行finally塊,有return,從這裡傳回。

無異常:

再執行finally塊

執行finally塊,有return,從這裡傳回。

c++ try catch語句_教你一招搞定try,catch,finally的執行順序

最終結論:

任何執行try 或者catch中的return語句之後,在傳回之前,如果finally存在的話,都會先執行finally語句,如果finally中有return語句,那麼程式就return了,是以finally中的return是一定會被return的,編譯器把finally中的return實作為一個warning。

繼續閱讀