2014-09-03 58 views
0

的想法是「嘗試you(),如果失敗嘗試_do(),如果失敗的話,從第一次嘗試上報例外,即you()」。重新拋出一個有嵌套異常的catch塊的異常嗎?

void that_thing() { 
    try { 
     you(); 
    } catch(...) { 
     bool error=false; 
     try { 
      _do(); 
     } catch(...) { 
      error = true; 
     } 
     if(error) throw; 
    } 
} 

使用Gcc測試它工作正常,我想知道它是否可以與任何編譯器一起使用。爲了更清楚,我期待的奇怪行爲是throw;將重新拋出內部異常。

編輯:這個問題是不是最內側catch,它是關於最醒目內後重新拋出外層的異常。問題在於,如果這種重新投票在法律上絕對沒有被提及的問題被指出爲類似的問題。

+0

另一個類似的問題:http://stackoverflow.com/questions/3526167/exception-handling-try-catch-inside-catch – 2014-09-03 07:51:47

+0

一致認爲它看起來不像它被關閉了,但我我不確定是什麼引發了這個問題。我會說「當然它不會重新拋出內在的例外」。考慮一個簡單的'try {foo(); } catch(...){bar();扔; }'。我從來沒有見過任何人擔心'bar'在內部拋出並捕獲異常時會發生什麼。你能否擴展一下你爲什麼認爲內部異常可能被重新拋出?更具體的問題可以得到更好的答案。 – hvd 2014-09-03 08:40:11

+0

沒有諮詢的標準或有任何特殊的知識對這個問題我會大膽地猜測,這只是罰款和編譯器*必須*跟蹤最例外。否則,如果'_DO()''使用嘗試/ catch'本身幕後和它剛剛吞下異常*和它得到了內聯*(甚至不內聯?),不好的事情會發生在你的代碼。 – 2014-09-03 08:43:18

回答

4

標準要求實施正確窩例外。從標準引證:

15.1拋出異常[except.throw]

...

8.一種擲表達無操作數重新拋出當前處理的異常( 15.3)。

15.3處理異常[except.handle]

...

7處理程序被認爲是活躍的時候初始化的catch子句的完整的形式參數(如果有的話)。 ...處理程序不再被視爲積極當catch子句退出或當std::unexpected()退出後正在進入因扔。

8最近激活的處理程序仍處於活動狀態的例外情況稱爲,當前處理的例外情況爲

當您的代碼到達throw;時,內部異常處理程序不再處於活動狀態:catch子句已退出。外部異常處理程序仍處於活動狀態:它尚未退出,並且尚未調用std::unexpected()。因此,實現必須支持這種用法,並重新拋出外部異常。內部處理程序退出後清除的全局「當前異常」指針將不符合C++標準的要求。