2016-08-13 95 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)以避免异常对象和潜在切片的额外副本。

所以你应该扔价值的物品(以避免终生问题)和通过引用赶上(避免切片和额外的副本)