C ++ catch块 - 按值或引用捕获异常?

时间:2010-03-26 09:57:01

标签: c++ exception-handling

  

可能重复:
  catch exception by pointer in C++

我总是按价值捕捉异常。 e.g

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

但是我遇到了一些代替catch(CustomException &e)的代码。这是a)罚款b)错误c)灰色区域?

4 个答案:

答案 0 :(得分:130)

C ++中异常的标准做法是......

  

按价值投掷,以参考方式捕捉

面对继承层次结构,按值获取是有问题的。假设您的示例中有另一个类型MyException继承自CustomException并覆盖错误代码之类的项目。如果抛出MyException类型,则catch块会导致它被转换为CustomException实例,这会导致错误代码发生更改。

答案 1 :(得分:27)

如果异常属于您捕获的类型的派生类型,则按值捕获将切片异常对象。

这对于catch块中的逻辑可能有问题,也可能没有关系,但没有理由不通过const引用捕获。

请注意,如果throw;在catch块中没有参数,则无论是否捕获到切片副本或对异常对象的引用,都会重新抛出原始异常。

答案 2 :(得分:8)

除非您想要处理异常,否则通常应使用const引用:catch (const CustomException& e) { ... }。编译器处理抛出对象的生命周期。

答案 3 :(得分:2)

(CustomException e)中创建了CustomException的新对象...所以它的构造函数将被调用,而在(CustomException& e)中它只是引用...没有创建新对象,也没有构造函数被称为...所以正式有点开销...以后最好使用......