C ++: Бросать исключения, использовать «новый» или нет? - PullRequest
26 голосов
/ 23 июля 2011

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

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

Ответы [ 2 ]

33 голосов
/ 23 июля 2011

Исключения в C ++ должны создаваться по значению и перехватываться по ссылке.

Так что это правильный путь:

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

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

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

7 голосов
/ 23 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...