为什么要将异常作为引用引用到const?

时间:2010-01-27 07:21:24

标签: c++ exception const

我多次听过并读过,最好将异常作为引用而不是引用来捕获。为什么

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

优于

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}

5 个答案:

答案 0 :(得分:54)

你需要:

  • 参考,以便您可以多态访问异常
  • 一个const来提高性能,并告诉编译器你不会修改对象

后者不像前者那样重要,但删除const的唯一真正原因是表示你想要对异常进行更改(通常只在你想要的时候才有用)将上下文添加到更高级别中重新抛出它。)

答案 1 :(得分:27)

根本没有理由。

异常对象存在于自己的内存空间中,因此您不必担心捕获在临时表达式中创建的异常。

你所做的只是承诺你不会修改异常对象,但是因为异常对象应该有一个不可变的接口,所以这里没有什么实用的。

然而,当你阅读它时,它可能会让你感到温暖和舒适 - 这就是我的感受!

他们有自己的特殊线程局部堆栈。
免责声明: Boost.Exception打破了这一点,以便做一些时髦的东西,并在构建后添加异常细节。但这很麻烦!

答案 2 :(得分:5)

它告诉编译器你不会调用任何修改异常的函数,这可能有助于优化代码。可能没有多大区别,但这样做的成本也非常小。

答案 3 :(得分:1)

你要修改例外吗?如果没有,它也可能是常数。同样的原因你应该在任何其他地方使用const(我说应该因为它在表面上没有真正的差别,可能有助于编译器,也可以帮助编码人员正确使用你的代码而不做他们不应该做的事情)

异常处理程序,可能是特定于平台的,并且可能会将异常放在有趣的地方,因为它们不期望它们会发生变化吗?

答案 4 :(得分:-1)

出于同样的原因,你使用了一个const。