C++:抛出异常,是否使用"new"?

C++: Throwing exceptions, use 'new' or not?

本文关键字:new 是否 抛出异常 C++      更新时间:2023-10-16

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

在捕捉时,我总是使用catch(FoobarException& e)"以防万一",但我从来没有找到一个可靠的答案,无论我是否必须在c++中使用new(绝对是Java),或者它只是程序员的偏好。

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

所以这是正确的方法:

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

不要抛出用new创建的异常,因为谁负责删除它是没有定义好的。此外,在错误处理期间执行分配可能会抛出另一个异常,从而掩盖原来的问题。

你不必通过const引用来捕获(非const也可以),但我喜欢这样做。但是,您应该始终通过引用(而不是通过值)以多态方式捕获异常。如果不这样做,则异常的类型可以被分割。

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