我是C ++的新手。我看到一些使用catch
块的代码示例,其中异常通过值捕获。例如:
catch(SomeClass e)
我也看到了一些引用的例子:
catch(const std:: out_of_range& e)
我假设如果通过引用捕获异常,则应该通过const
引用。
我的问题是,当建议使用每种方式时,每种方式有哪些优点/缺点?
谢谢!
答案 0 :(得分:6)
建议您通过引用捕获异常,原因有两个:
按值捕获异常将最终生成抛出的异常对象的副本(与传递参数将生成该对象的副本的方式相同)。尽管异常处理可能有点慢,但仍然值得尝试避免这种低效率。
如果抛出派生类型的异常并按值捕获基类型,则 slice 异常的方式与将派生类型按值传递到函数中的方式相同那个对象。这可能会导致程序中出现错误或异常行为。
希望这有帮助!
答案 1 :(得分:3)
我无法想到按值捕获的任何优势,并且它导致对象切片的可能性,其中对象被转换为基类并且信息丢失。我总是通过引用抓住。
例如,可以修改捕获的对象并重新抛出它,因此您不必 使其成为const
引用。但这也是一个好主意。