我多次听过并读过,最好将异常作为引用而不是引用来捕获。为什么
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
优于
try {
// stuff
} catch (std::exception& e) {
// stuff
}
答案 0 :(得分:54)
你需要:
后者不像前者那样重要,但删除const的唯一真正原因是表示你想要对异常进行更改(通常只在你想要的时候才有用)将上下文添加到更高级别中重新抛出它。)
答案 1 :(得分:27)
根本没有理由。
异常对象存在于自己的内存空间†中,因此您不必担心捕获在临时表达式中创建的异常。
你所做的只是承诺你不会修改异常对象,但是因为异常对象应该有一个不可变的接口‡,所以这里没有什么实用的。
然而,当你阅读它时,它可能会让你感到温暖和舒适 - 这就是我的感受!
†他们有自己的特殊线程局部堆栈。
‡ 免责声明: Boost.Exception打破了这一点,以便做一些时髦的东西,并在构建后添加异常细节。但这很麻烦!
答案 2 :(得分:5)
它告诉编译器你不会调用任何修改异常的函数,这可能有助于优化代码。可能没有多大区别,但这样做的成本也非常小。
答案 3 :(得分:1)
异常处理程序,可能是特定于平台的,并且可能会将异常放在有趣的地方,因为它们不期望它们会发生变化吗?
答案 4 :(得分:-1)
出于同样的原因,你使用了一个const。