我听说过很多次,最好将异常捕获为对const的引用而不是引用。为什么是:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
优于:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
Answers:
你需要:
后者不像前者那么重要,但是删除const的唯一真正原因是发出信号,表明您想对异常进行更改(通常仅在您希望将其添加到更高级别的上下文中重新抛出该异常时才有用) 。
std::exception
的what()
函数)。如果按值捕获,则无法调用该函数并获取原始异常详细信息。
根本没有理由。
异常对象生活在自己的内存空间†所以您不必到大约醒目的临时表达式创建的异常担心。
您所做的一切都是保证您不会修改异常对象,但是由于异常对象应该具有不可变的接口‡,因此这里实际上没有任何实际意义。
但是,当您阅读它时,可能会让您感到温暖和舒适-这就是我的感受!
†它们具有自己的特殊线程本地堆栈。
• 免责声明: Boost.Exception破坏了此功能,以便进行时髦的操作并在构造后添加异常详细信息。但这是黑客!
Exception objects live in their own memory space
吗?您是否对此有很好的建议?