c++ 为什么要将异常捕获为引用常量?

2w3kk1z5  于 2023-01-22  发布在  其他
关注(0)|答案(6)|浏览(148)

我听过很多次,也读过很多次,最好将异常作为对常量的引用而不是作为引用来捕获。

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

优于:

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

4zcjmb1e1#

您需要:

  • 一个引用,以便您可以以多态方式访问异常
  • 一个常量以提高性能,并告诉编译器您不打算修改该对象

后者没有前者那么重要,但删除const的唯一真正原因是发出信号,表明您希望对异常进行更改(通常只有在您希望将添加了上下文的异常重新抛出到更高级别时才有用)。

qyuhtwio

qyuhtwio2#

基本上没有任何理由。
异常对象存在于它们自己的内存空间中,所以你不必担心捕捉临时表达式中创建的异常。
你所做的只是承诺不会修改异常对象,但由于异常对象应该有一个不可变的接口‡,所以这里实际上没有什么实际意义。
然而,当你读它的时候,它可能会让你感到温暖和舒适--这就是我的感受!
†它们有自己特殊的线程局部堆栈。
‡**免责声明:**Boost。异常破坏这个是为了做一些时髦的事情,并添加异常细节,后期构造。但这是黑客行为!

5lhxktic

5lhxktic3#

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

ruoxqz4g

ruoxqz4g4#

你要修改异常吗?如果不修改,它也可以是const。同样的原因你应该在其他地方使用const(我说应该是因为它在表面上没有太大的区别,可能会帮助编译器,也帮助程序员正确地使用你的代码,不做他们不应该做的事情)
异常处理程序,可能是特定于平台的,可能会把异常放在有趣的地方,因为他们不希望它们改变?

mkh04yzy

mkh04yzy5#

调用std::exception::what()并获取原始消息,而不是“std::exception”。
这在其他响应中是隐含的,但对我来说是主要用例,这是多态异常的一个令人困惑的问题,应该相应地突出显示。
顺便说一句,在本地上下文/相同的函数中,.what()通常工作得很好。我猜是因为编译器优化。

tf7tbtn2

tf7tbtn26#

原因和使用const相同。

相关问题