Умовний спосіб кидати та виловлювати винятки - це викинути об’єкт виключення та зловити його посиланням (як правило, constпосиланням). Мова C ++ вимагає від компілятора генерувати відповідний код для побудови об'єкта виключення та належного його очищення у відповідний час.
Кидати вказівник на динамічно виділений об’єкт ніколи не є хорошою ідеєю. Винятки повинні дозволяти вам писати більш надійний код за умови помилок. Якщо ви кидаєте об'єкт винятку звичайним чином, ви можете бути впевнені, що, потрапив він у застереження про вилов, що називає правильний тип, a catch (...), чи він буде потім повторно кинутий чи ні, він буде зруйнований правильно у відповідний час. (Єдиним винятком є те, що його взагалі ніколи не впіймають, але це ситуація, яка не підлягає відновленню, залежно від того, на який ви спосіб ви її дивитесь.)
Якщо ви кидаєте вказівник на динамічно виділений об'єкт, ви повинні бути впевнені, що незалежно від того, як виглядає стек виклику в точці, яку ви хочете викинути, є блок лову, який називає правильний тип вказівника і має відповідний deleteвиклик. Виняток ніколи не повинен бути перехоплений, catch (...)якщо цей блок не перекидає виняток, який потім потрапляє на інший блок лову, який правильно поводиться з виключенням.
Ефективно це означає, що ви скористалися функцією обробки винятків, яка повинна полегшити написання надійного коду і дуже важко писати правильний код у всіх ситуаціях. Це залишає осторонь питання про те, що діяти як код бібліотеки для клієнтського коду, який не очікує на цю функцію, буде майже неможливо.
throw gcnewбуло б корисно, наприклад. якщо ви хочете, щоб керований код зафіксував ваше виняток. Хтось може мене виправити на цьому?