通过参照捕捉对象

Catching objects by reference

本文关键字:对象      更新时间:2023-10-16

我是C++的新手。我看到了一些使用catch块的代码示例,其中异常由值捕获。例如:

catch(SomeClass e)

我还看到了一些引用捕获的例子:

catch(const std:: out_of_range& e)

我假设,如果异常是通过引用捕获的,那么它应该是通过const引用捕获的。

我的问题是,什么时候建议使用每种方式,每种方式的优点/缺点是什么?

谢谢!

建议您通过引用捕获异常,原因有两个:

  1. 通过值捕获异常最终会生成抛出的异常对象的副本(与传递参数生成该对象的副本的方式相同)。尽管异常处理可能有点慢,但仍然值得尝试避免这种低效。

  2. 如果抛出派生类型的异常并按值捕获基类型,则将切片异常,就像按值将派生类型传递到函数中将切片该对象一样。这可能导致程序中出现错误或异常行为。

希望这能有所帮助!

我想不出按值捕获有什么好处,它导致了对象切片的可能性,对象被转换为基类,信息丢失。我总是通过参考来捕捉。

例如,可以修改捕获的对象并重新抛出它,这样就不需要使其成为const引用。但这也是个好主意。