Possible Duplicate: 在 C + + 中通过指针捕捉异常
我总是通过值来捕捉异常
try{ ... } catch(CustomException e){ ... }
但是我遇到了一些代码,代之以 catch(CustomException &e)。这是 a)罚款 b)错误 c)灰色地带吗?
catch(CustomException &e)
如果异常是所捕获类型的派生类型,则按值捕获将 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.
throw;
C + + 中异常的标准实践是..。
通过值抛出,通过引用捕获
在继承层次结构面前,通过值捕获是有问题的。假设您的示例中有另一种类型的 MyException,它从 CustomException继承而来,并重写项,比如错误代码。如果抛出一个 MyException类型,那么 catch 块将导致它被转换为一个 CustomException实例,从而导致错误代码发生更改。
MyException
CustomException
除非您想处理异常,否则通常应该使用常量引用: catch (const CustomException& e) { ... }。编译器处理抛出对象的生存期。
catch (const CustomException& e) { ... }
在 (CustomException e)中创建 CustomException 的新对象... 所以它的构造函数将被调用,而在(CustomException & e)中它只是引用... 没有新对象被创建,也没有构造函数将被调用... 所以形式是有一点开销... 以后更好地使用..。
(CustomException e)