通过值或引用捕获异常?

Possible Duplicate:
在 C + + 中通过指针捕捉异常

我总是通过值来捕捉异常

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

但是我遇到了一些代码,代之以 catch(CustomException &e)。这是 a)罚款 b)错误 c)灰色地带吗?

68923 次浏览

如果异常是所捕获类型的派生类型,则按值捕获将 slice作为异常对象。

这可能与 catch 块中的逻辑有关,也可能无关,但是没有什么理由不使用 const 引用进行 catch。

Note that if you throw; without a parameter in a catch block, the original exception is rethrown whether or not you caught a sliced copy or a reference to the exception object.

C + + 中异常的标准实践是..。

通过值抛出,通过引用捕获

在继承层次结构面前,通过值捕获是有问题的。假设您的示例中有另一种类型的 MyException,它从 CustomException继承而来,并重写项,比如错误代码。如果抛出一个 MyException类型,那么 catch 块将导致它被转换为一个 CustomException实例,从而导致错误代码发生更改。

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

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