2013-06-21 42 views
3

這可能是一個微不足道的問題 - 但它對我來說並不明顯,所以我需要一些確認。假設我有一個try-catch塊的功能:C++ try-catch異常處理約定

int function some_crap() { 
    some_type b; 
    int a = 10; 
    try { 
     a = boost::numeric_cast<int>(b); 
    } 
    catch(boost::bad_numeric_cast& e) { 
     std::cout << e.what() << std::endl; 
     return a; 
    } 
    catch(...) { 
     //-Handle other unknown exceptions 
     return a; 
    } 
    return a; 
} 

IIRC,我需要把return a語句在每個catch塊的,對不對?同樣在catch的每個塊中,a的值將分別爲10,對不對?

感謝您的時間&興趣。 --T

+0

你可以把一個'返回;在你的函數 –

+0

感謝@Basie的盡頭'聲明。所以你說這個計劃將會在catch塊之外迴歸?這是我不確定的部分。 –

+0

處理未知的例外是不可能的。你可以忽略它們,但那不是真正的「處理」。 – Casey

回答

4

IIRC,我需要把return a語句在每個catch塊的,對不對?

不,不是在這種情況下。重要的是,如果不返回任何東西(6.6.3/2,這將是未定義的行爲),你不會返回值返回函數的末尾。

既然你有一個return語句:

return a; 

在你的函數結束時,不要求您catch塊包含一個。

另外,如果你沒有任何價值在出錯的情況下返回,你可以通過做重新拋出當前處理的例外:

throw; 

或避免到捕獲和重新拋出異常的所有並通過忽略相應的catch塊來讓它傳播,以防您沒有足夠的如何恢復知識和/或您不需要記錄任何消息。

讓異常沿着調用堆棧可以比只是返回一個硬編碼值,如10

至於第二個問題更有意義:

同樣在每個掣子的塊,一個將有10的價值,對吧?

是的,這是保證。

2

由於您在函數結束時有return a,因此您可以在內省略return a catch。但是,它的返回捕獲也可以。