C ++ catch块 – 通过值或引用捕获exception?

可能重复:
在C ++中通过指针捕获exception

我总是通过价值来捕捉exception。 例如

try{ ... } catch(CustomException e){ ... } 

但我碰到一些代码,而不是catch(CustomException &e) 。 这是a)罚款b)错误c)灰色地带?

在C ++中的例外标准做法是…

按价值抛售,按参考收获

面对inheritance层次结构,按值捕获是有问题的。 假设你的例子有另外一个types为MyExceptioninheritance于CustomException并且重写了一些错误代码。 如果一个MyExceptiontypes被抛出,你的catch块会导致它被转换成一个CustomException实例,这将导致错误代码的改变。

参考

如果exception是派生types的,则按值捕获将划分exception对象。

这可能或可能不会影响你的catch块的逻辑,但没有什么理由不被const引用捕获。

请注意,如果你throw; 在catch块中没有参数的情况下,无论是否捕获切片副本或对exception对象的引用,都会重新生成原始exception。

除非你想摆弄这个exception,否则通常应该使用一个const引用: catch (const CustomException& e) { ... } 。 编译器处理抛出的对象的生命周期。

(CustomException e)中创buildCustomException的新对象…所以它的构造函数将被调用,而在(CustomException&e)它将只是引用…不是新的对象被创build,没有构造函数会被调用…所以正式有一点点的开销…以后更好使用…