2015-11-06 116 views
0

如果你有這樣的函數調用,哪個級別最適合我的拋出?我只想彈出一條錯誤消息。C++何時處理異常

class Test { 
    void A() { 
     B(); 
     // try and catch here ? 
    } 

    void B() { 
     C(); 
     // try and catch here ? 
    } 

    void C() { 
     throw 1; 
    } 
    } 

    int main() 
    { 
    Test test; 
    test.A(); 
    // try and catch here ? 

    return 0; 
    } 
+0

這真的取決於實際情況。您可能想要捕獲一些異常,同時讓其他異常傳播到調用堆棧。 – NathanOliver

+0

恕我直言,只要你知道可以拋出異常,是重要的事情。在哪裏或如果你抓住它,這是主觀的。 – PaulMcKenzie

+0

@PaulMcKenzie _subjective_在這裏沒有完全適合恕我直言,_使用情況依賴_應該是更好的描述。我不是那麼確定,如果這會讓問題脫離主題,或者需要更多的澄清。 –

回答

0

當您決定處理異常時,很大程度上取決於設計模式和特定場景,但通常情況下,只要您能夠可靠地處理,就想處理異常。

如果您沒有足夠的信息來處理異常,則應該在調用堆棧中拋出較高的異常。一些理由如下:

  1. 例外是不是檢查返回類型錯誤處理
  2. 更加昂貴,如果你繼續拋出異常調用堆棧大量的代碼將無法運行(或者至少你必須寫很多凌亂的finally塊)
  3. 功能,高調用堆棧上將會引起了很多不同類型的異常所累,並在其預期的工作的方式得到

反之,如果趕上和交易只要你能夠可靠地儘早發生異常這樣做的:

  1. 功能是調用堆棧比catch塊甚至不知道發生了例外

  2. 你將避免過度的異常拋出獲得的性能提升更高

  3. 一般都比較好設計分離問題。

+0

_「你將通過避免過多的異常拋出來獲得性能提升」_這是'catch'引入成本,而不是'throw'。 –

0

那麼,這取決於您的實際使用情況。

如果你只是想彈出一個錯誤信息,並終止你的程序,你應該什麼也不抓。

默認的std::terminate處理程序已經做到了。

如果您只是想顯示一條錯誤消息並繼續構建,您應該從可以克服錯誤並能夠安全地繼續您的程序運行狀態的級別捕獲。