【发布时间】:2011-01-09 20:24:18
【问题描述】:
我多次听到并阅读到,最好将异常捕获为对 const 的引用,而不是作为引用。为什么是:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
优于:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
【问题讨论】:
我多次听到并阅读到,最好将异常捕获为对 const 的引用,而不是作为引用。为什么是:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
优于:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
【问题讨论】:
你需要:
后者没有前者那么重要,但删除 const 的唯一真正原因是表明您想要对异常进行更改(通常只有在您想要将其与添加的上下文重新抛出到更高的级别)。
【讨论】:
std::exception的what()函数)。如果按值捕获,则无法调用该函数并获取原始异常详细信息。
基本上没有任何理由。
异常对象存在于它们自己的内存空间中†,因此您不必担心捕获在临时表达式中创建的异常。
你所做的只是保证你不会修改异常对象,但是由于异常对象应该有一个不可变的接口‡,所以这里真的没有什么实用的。
然而,它可能会让你在阅读时感到温暖和舒适——这就是我的感觉!
† 他们有自己的特殊线程本地堆栈。
‡免责声明: Boost.Exception 打破了这一点,以便做一些时髦的事情并在构建后添加异常细节。但这是骇人听闻的!
【讨论】:
Exception objects live in their own memory space ?你有什么好的建议吗?
它告诉编译器你不会调用任何修改异常的函数,这可能有助于优化代码。可能没有太大区别,但这样做的成本也很小。
【讨论】:
你要修改异常吗?如果不是,它也可能是 const。您应该在其他任何地方使用 const 的原因相同(我说应该是因为它在表面上并没有太大的区别,可能有助于编译器,也有助于编码人员正确使用您的代码,而不是做他们不应该做的事情)
异常处理程序,可能是特定于平台的,并且可能将异常放在有趣的地方,因为它们不希望它们发生变化?
【讨论】:
出于同样的原因,您使用 const。
【讨论】: