处理程序捕获的对象是原始的副本?

时间:2012-04-14 23:04:50

标签: c++ exception-handling

这段摘录来自Bjarne的书:

  

原则上,抛出异常时会复制异常,因此处理程序会获取原始异常的副本。实际上,异常可能会在被捕获之前被复制多次。因此,我们不能抛出无法复制的异常。

如果我们通过引用或指针捕获异常,那么这不成立。我对吗? 这里的作者是否意味着首先在内部复制抛出的对象,并将该副本传递给handler参数,如果handler参数按值传递,那么将再次复制该参数

1 个答案:

答案 0 :(得分:2)

无论异常是由值还是引用捕获的,它仍然是对象的副本。我可以推荐阅读Meyers,更有效的C ++,第12项“了解如何抛出异常与传递参数或调用虚函数有什么不同”,这对此有所启发。
即使catch处理程序通过引用捕获,引用也必须是副本,因为原始对象可能已被销毁 但请注意,指针捕获不涉及副本 - 但是thrower负责确保捕获器获取指针的异常尚未被销毁。不推荐按指针捕捉。这只是迈耶斯总体上建议总是通过参考引用的一个原因,参见Meyers,第13项“通过引用获取异常”,供其他人使用!