Подтвердить что ты не робот

С++: Выбрасывание исключений, использование "нового" или нет?

Правильно ли использовать throw new FoobarException(Baz argument); или throw FoobarException(Baz argument);?

При ловле я всегда использую catch(FoobarException& e) "на всякий случай", но я никогда не мог найти твердого ответа, нужно ли мне использовать новый или нет в С++ (определенно Java) или если это было только предпочтение программиста.

4b9b3361

Ответ 1

Исключения в С++ должны быть сброшены по значению и пойманы по ссылке.

Итак, это правильный способ:

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

Не создавайте исключение, созданное с новым, так как тот, кто ответственен за его удаление, не определен. Кроме того, выполнение распределений при обработке ошибок может вызвать другое исключение, затеняя исходную проблему.

Вам не нужно ловить ссылку const (не-const будет работать нормально), но мне все равно нравится делать это. Однако вы должны всегда ссылаться (не по значению), чтобы ловить исключение полиморфно. Если вы этого не сделаете, тип исключения можно будет нарезать.

Ответ 2

если нет особых требований, чтобы не делать этого, я всегда бросаю значение и ломаю ссылку const. Это связано с тем, что сам new также может генерировать исключение, во время обработки ошибок лучше избегать ситуаций, которые могут вызывать исключения.