2013-07-18 44 views
2

Sutter和Alexandrescu的編碼標準tell us通過引用來捕獲異常。有什麼理由通過價值捕捉異常?

當然,像這樣的一攬子建議通常偶爾會有例外(不是雙關語)。有什麼用例應該首選按值捕獲異常?

+0

@LeonLi不,這個問題是問哪個更好。這個問題已經說這個答案是一個假設。 – Potatoswatter

+1

什麼?這個q *只說*指針,這沒有提到。這個問題不是關於其他人處理的最佳實踐,而是關於已經接受的最佳實踐之外的特定案例。 – Potatoswatter

回答

5

除了不需要複製或執行復制(可能是複製)的明顯原因之外,獲取引用的好處是您可以修改它並繼續使用throw;進行處理。

如果要修改的對象,但繼續throw;未改性對象的異常處理,那麼你必須做一個副本,做的一種方式,從而是價值漁獲物。

雖然我覺得這很有意思。通過const引用,然後顯式複製可以更好地表達意圖。

另請注意,拋出一個新的C++ 11 nested_exception將在新異常中嵌套以前拋出的異常對象,而不是按值接收的對象。在這種情況下,你可以想象自己會引用收到的異常,除非你通過引用收到異常,否則它將失效。

+4

通過引用捕獲的另一個原因是,當拋出派生的異常類並使用基類引用捕獲時,避免切片。 –

+0

@RemyLebeau謝謝,更新。 – Potatoswatter