Ответ 1
Обычный способ исключения и исключения исключений - это выброс объекта исключения и его привязка по ссылке (обычно const
ссылка). Язык С++ требует, чтобы компилятор сгенерировал соответствующий код для создания объекта исключения и правильно очистил его в соответствующее время.
Бросание указателя на динамически выделенный объект никогда не является хорошей идеей. Предполагается, что исключения позволят вам написать более надежный код перед лицом ошибок. Если вы бросаете объект исключения обычным образом, вы можете быть уверены, что если он пойман с помощью предложения catch, называющего правильный тип, с помощью catch (...)
, будет ли он повторно вставлен или нет, он будет правильно уничтожен на подходящее время. (Единственное исключение, если оно никогда не попадается, но это не восстанавливаемая ситуация, если вы посмотрите на нее.)
Если вы бросаете указатель на динамически выделенный объект, вы должны быть уверены, что независимо от того, какой стек вызовов выглядит в точке, в которой вы хотите создать исключение, есть блок catch, который называет правильный тип указателя и имеет соответствующий delete
вызов. Ваше исключение никогда не должно быть поймано catch (...)
, если только этот блок не повторяет исключение, которое затем поймано, является еще одним блоком catch, который корректно обрабатывает исключение.
Эффективно, это означает, что вы использовали функцию обработки исключений, которая должна упростить запись надежного кода и очень затруднительно записать код, который является правильным во всех ситуациях. Это оставляет в стороне проблему, что почти невозможно будет выступать в качестве кода библиотеки для клиентского кода, который не ожидает этой функции.