C ++ catch块 – 通过值或引用捕获exception?
可能重复:
在C ++中通过指针捕获exception
我总是通过价值来捕捉exception。 例如
try{ ... } catch(CustomException e){ ... }
但我碰到一些代码,而不是catch(CustomException &e)
。 这是a)罚款b)错误c)灰色地带?
在C ++中的例外标准做法是…
按价值抛售,按参考收获
面对inheritance层次结构,按值捕获是有问题的。 假设你的例子有另外一个types为MyException
inheritance于CustomException
并且重写了一些错误代码。 如果一个MyException
types被抛出,你的catch块会导致它被转换成一个CustomException
实例,这将导致错误代码的改变。
参考
如果exception是派生types的,则按值捕获将划分exception对象。
这可能或可能不会影响你的catch块的逻辑,但没有什么理由不被const引用捕获。
请注意,如果你throw;
在catch块中没有参数的情况下,无论是否捕获切片副本或对exception对象的引用,都会重新生成原始exception。
除非你想摆弄这个exception,否则通常应该使用一个const引用: catch (const CustomException& e) { ... }
。 编译器处理抛出的对象的生命周期。
在(CustomException e)
中创buildCustomException的新对象…所以它的构造函数将被调用,而在(CustomException&e)它将只是引用…不是新的对象被创build,没有构造函数会被调用…所以正式有一点点的开销…以后更好使用…