2013-10-22 89 views
2

之間有什麼區別:異常重新拋出

foo(); 

try{ 
    foo(); 
} catch (...){ 
    throw; 
} 

我的理解 - 如果在功能上沒有的try-catch塊調用foo() - 異常會被外部函數的try-catch塊捕獲(如果有的話)。我對嗎?如果函數調用foo(),但沒有捕捉者可以處理它的try-catch塊 - 我必須寫catch(...){throw;讓它被外面的人抓住?有必要嗎?

+0

只抓住你能處理的事情,或者如果你需要做地方清理。 –

+1

剛剛重新拋出的一切都基本上沒有任何操作,並且沒有任何用處。 –

+0

例外情況應該通常以最適合的級別進行處理。所以如果'foo()'對某些異常有異常處理,它只是它知道如何處理的異常。如果調用'foo()'的函數知道如何處理所有異常情況,那麼'''一般都可以 - 意味着你知道你在做什麼。或者,也可以在這裏處理特定的異常,並讓未知的異常傳播...因此,總而言之,取決於拋出什麼...... – Nim

回答

2

沒有操作數的拋出表達式拋出異常處理爲 。 [§15.1/ 8]

所以實際上也是一樣的。

 

異常會被外界的功能try-catch塊被捕獲(如果 有的話)。我對嗎?

是的。

 

但如果有什麼功能一個try-catch塊調用foo(), 但沒有捕手誰可以處理它 - 我必須寫趕上(...){拋出; 扔;讓它被外面的人抓住?有必要嗎?

處理您希望在呼叫點處理它們並將其他人處理的異常。你不必重新扔掉它們。如果沒有捕手,最終會捕獲異常std:terminate將被調用。

try 
{ 
    foo(); 
} 
catch (YourExpectedException &ex) 
{ 
    // ... 
} 
catch (...) \ 
{    \ 
       > // You don't need this kind of re-throwing 
    throw; /
}   /
+0

感謝您的回答! –