2015-02-04 85 views
1

我是C++的新手。我看到一些使用catch塊的代碼示例,其中異常被值捕獲。例如:通過引用捕獲對象

catch(SomeClass e) 

我也看到一些例子,通過參考趕上:

catch(const std:: out_of_range& e) 

我假設在異常被抓住了參考的情況下,應當由const參考。

我的問題是,什麼時候推薦使用每種方式,每種方式的優點/缺點是什麼?

謝謝!

+0

想一想:就像拿一個參數,你什麼時候會接受一個多態參數? –

回答

3

我想不出有什麼好處,值得捕獲,並導致對象切片的可能性,其中的對象被轉換爲基類和信息丟失。我會一直引用。

有可能修改捕獲的對象並重新拋出它,例如,所以你不要使它成爲const引用。但這也是一個好主意。

6

它的建議,你趕上通過引用異常的原因有兩個:

  1. 通過值捕獲異常最終會使得被拋出的異常對象的副本(同樣的方式,傳遞一個參數將使該對象的副本)。儘管異常處理可能有點慢,但仍然值得試圖避免這種低效率。

  2. 如果拋出一個派生類型的異常和值catch基本類型,你會異常相同的方式,傳遞一個派生類型成函數按值將切片該對象。這可能會導致程序中出現不正確或不正常的行爲。

希望這有助於!