通过引用捕获对象

时间:2015-02-04 21:43:48

标签: c++ exception reference

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

catch(SomeClass e)

我也看到了一些引用的例子:

catch(const std:: out_of_range& e)

我假设如果通过引用捕获异常,则应该通过const引用。

我的问题是,当建议使用每种方式时,每种方式有哪些优点/缺点?

谢谢!

2 个答案:

答案 0 :(得分:6)

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

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

  2. 如果抛出派生类型的异常并按值捕获基类型,则 slice 异常的方式与将派生类型按值传递到函数中的方式相同那个对象。这可能会导致程序中出现错误或异常行为。

  3. 希望这有帮助!

答案 1 :(得分:3)

我无法想到按值捕获的任何优势,并且它导致对象切片的可能性,其中对象被转换为基类并且信息丢失。我总是通过引用抓住。

例如,可以修改捕获的对象并重新抛出它,因此您不必 使其成为const引用。但这也是一个好主意。