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

时间:2011-07-23 16:38:54

标签: c++ exception throw

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

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

2 个答案:

答案 0 :(得分:33)

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

所以这是正确的方法:

try
{
    throw FoobarException(argument);
}
catch( const FoobarException &ex )
{
    cout << ex.what() << endl;
}

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

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

答案 1 :(得分:7)

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