Обычный способ исключения и исключения исключений заключается в том, чтобы выбросить объект исключения и уловить его ссылкой (обычно const
). Язык C++ требует, чтобы компилятор сгенерировал соответствующий код для создания объекта исключения и правильно очистил его в соответствующее время.
Бросок указателя на динамически выделенный объект никогда не является хорошей идеей. Предполагается, что исключения позволят вам написать более надежный код перед лицом ошибок. Если вы выбрали объект исключения обычным способом, вы можете быть уверены, что если он пойман по ключу, именовав правильный тип, с помощью catch (...)
, будет ли он повторно перезаписан или нет, он будет правильно уничтожен в соответствующее время , (Единственное исключение - если это никогда не поймано, но это не восстанавливаемая ситуация, если вы посмотрите на нее.)
Если вы бросаете указатель на динамически выделенный объект, вы должны быть уверены, что независимо от того, стек вызовов выглядит так, как будто вы хотите выбросить свое исключение, есть блок catch, который называет правильный тип указателя и имеет соответствующий вызов delete
.Ваше исключение никогда не должно быть уловлено catch (...)
, если только этот блок не повторяет исключение, которое затем попадает в другой блок catch, который правильно справляется с исключением.
Фактически это означает, что вы использовали функцию обработки исключений, которая должна облегчать запись надежного кода и очень затрудняет запись кода, который является правильным во всех ситуациях. Это оставляет в стороне вопрос о том, что практически невозможно будет действовать как код библиотеки для клиентского кода, который не ожидает этой функции.
Я думаю, что 'throw gcnew' было бы полезно, например. если вы хотите, чтобы управляемый код поймал ваше исключение. Может ли кто-нибудь меня исправить? – jpalecek
.Net имеет дело с исключениями указателем, поэтому бросить gcnew - это правильная вещь. –
@SebastianRedl .Net «указатель» может быть неоднозначным? Хотя gcnew, конечно же, нет. 'System :: Exception', как правило, является ссылкой на управляемый объект на сборку мусора. Я всегда бросал «gcnew» и поймал «System :: Exception». Конечно, я все время использую 'finally' в C++/CLI, хотя не часто смешиваю с исключениями C++ в одном блоке' try', я не уверен, почему. –