C++:抛出异常,使用"新"或不使用?

Cas*_*sey 26 c++ exception throw

是否适合使用throw new FoobarException(Baz argument);throw FoobarException(Baz argument);

在捕捉时我总是使用catch(FoobarException& e)"以防万一",但我无法找到一个可靠的答案,我是否必须在C++中使用新的或不使用(肯定是Java),或者它只是程序员的偏好.

Sve*_*ven 33

C++中的异常应该按值抛出,并通过引用捕获.

所以这是正确的方法:

try
{
    throw FoobarException(argument);
}
catch( const FoobarException &ex )
{
    cout << ex.what() << endl;
}
Run Code Online (Sandbox Code Playgroud)

不要抛出使用new创建的异常,因为负责删除它的人没有明确定义.此外,在错误处理期间执行分配可能会抛出另一个异常,从而模糊了原始问题.

您不必通过const引用捕获(非const将正常工作),但我还是喜欢这样做.但是,您应该始终通过引用(而不是值)来多态地捕获异常.如果不这样做,则可以切除异常的类型.


Eva*_*ran 7

除非有一些特殊要求,否则我总是按价值投掷,并const引用参考.这是因为它new本身也可以抛出异常,在错误处理期间,最好避免可能导致异常的事情.