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