2016-08-13 61 views
0

嗯,我一直在閱讀this文章,討論如何避免異常處理的錯誤,似乎不錯,但有一點我堅持了澄清,他這樣說它是很好的參照拋出一個異常對象

當引發異常並且控制從try塊傳遞到 處理程序時,C++運行時調用自try塊開始以來構造的所有自動對象 的析構函數。

而一個它似乎表明,通過引用在catch得到拋出的對象的另一點是,因爲它避免存儲管理和複製好的做法,似乎什麼奇怪,我是

try 
{ 

Object o; 
//make error.. 
throw ref(o); 
}catch(Object & p) 
{ 
//do some handle.. 
} 

有什麼比較時說這將是很好的去與上面的代碼並不是所有的對象內部構建的嘗試展開,當它達到拋出或它會放鬆後捕捉?

+1

扔價值。抓住參考。 –

+1

什麼?從參考文獻:「錯誤#6:不按價值拋出異常」, –

回答

2

通過引用拋出一個異常對象是否好?

不是。在你的示例中,o將在拋出後作爲堆棧展開的一部分被銷燬,因此您將捕獲懸掛的引用。

做什麼文章說,按價值計算拋出:throw o;throw std::move(o);(如果o便宜到布展難以複製)或單獨的移動功能異常的調整和這樣做throw make_error(/*...*/)。這將會拋出一個對象o的副本,該副本具有單獨的生命週期,並且不會被堆棧展開銷燬,直到它被處理。

您應該引用異常(catch Object& o)以避免異常對象和潛在切片的額外副本。

所以你應該扔價值的物品(以避免終生問題)和通過引用趕上(避免切片和額外的副本)