通过引用捕获对象
Catching objects by reference
我是 C++ 新手。我看到一些使用 catch
块的代码示例,其中异常是按值捕获的。例如:
catch(SomeClass e)
我也看到了一些被引用的例子:
catch(const std:: out_of_range& e)
我假设如果通过引用捕获异常,则应该通过 const
引用。
我的问题是,每种方式推荐什么时候使用,每种方式的advantages/disadvanges是什么?
谢谢!
建议您通过引用捕获异常,原因有二:
按值捕获异常将最终复制抛出的异常对象(与传递参数将复制该对象的方式相同)。尽管异常处理可能有点慢,但仍然值得尝试避免这种低效率。
如果您抛出派生类型的异常并按值捕获基类型,您将切片异常的方式与传递派生类型的方式相同按值转换为函数将对该对象进行切片。这可能会导致程序出现不正确或异常的行为。
希望对您有所帮助!
我想不出按值捕获有什么好处,它导致对象切片的可能性,其中对象被转换为基数 class 并且信息丢失。我总是通过参考来捕捉。
例如,可以修改捕获的对象并重新抛出它,因此您没有使其成为const
参考。但这也是个好主意。
我是 C++ 新手。我看到一些使用 catch
块的代码示例,其中异常是按值捕获的。例如:
catch(SomeClass e)
我也看到了一些被引用的例子:
catch(const std:: out_of_range& e)
我假设如果通过引用捕获异常,则应该通过 const
引用。
我的问题是,每种方式推荐什么时候使用,每种方式的advantages/disadvanges是什么?
谢谢!
建议您通过引用捕获异常,原因有二:
按值捕获异常将最终复制抛出的异常对象(与传递参数将复制该对象的方式相同)。尽管异常处理可能有点慢,但仍然值得尝试避免这种低效率。
如果您抛出派生类型的异常并按值捕获基类型,您将切片异常的方式与传递派生类型的方式相同按值转换为函数将对该对象进行切片。这可能会导致程序出现不正确或异常的行为。
希望对您有所帮助!
我想不出按值捕获有什么好处,它导致对象切片的可能性,其中对象被转换为基数 class 并且信息丢失。我总是通过参考来捕捉。
例如,可以修改捕获的对象并重新抛出它,因此您没有使其成为const
参考。但这也是个好主意。