通过参照捕捉对象
Catching objects by reference
本文关键字:对象 更新时间:2023-10-16
我是C++的新手。我看到了一些使用catch
块的代码示例,其中异常由值捕获。例如:
catch(SomeClass e)
我还看到了一些引用捕获的例子:
catch(const std:: out_of_range& e)
我假设,如果异常是通过引用捕获的,那么它应该是通过const
引用捕获的。
我的问题是,什么时候建议使用每种方式,每种方式的优点/缺点是什么?
谢谢!
建议您通过引用捕获异常,原因有两个:
-
通过值捕获异常最终会生成抛出的异常对象的副本(与传递参数生成该对象的副本的方式相同)。尽管异常处理可能有点慢,但仍然值得尝试避免这种低效。
-
如果抛出派生类型的异常并按值捕获基类型,则将切片异常,就像按值将派生类型传递到函数中将切片该对象一样。这可能导致程序中出现错误或异常行为。
希望这能有所帮助!
我想不出按值捕获有什么好处,它导致了对象切片的可能性,对象被转换为基类,信息丢失。我总是通过参考来捕捉。
例如,可以修改捕获的对象并重新抛出它,这样就不需要使其成为const
引用。但这也是个好主意。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 构造对象的歧义
- 使用"std::unordereded_map"映射到"std::list"对象