27

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

捕捉时我总是使用catch(FoobarException& e)“以防万一”,但无论我是否必须在 C++(绝对是 Java)中使用 new 或者这只是程序员的偏好,我都找不到可靠的答案。

4

2 回答 2

34

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

所以这是正确的方法:

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

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

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

于 2011-07-23T16:41:36.833 回答
8

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

于 2011-07-23T16:43:13.630 回答