Одним из них является использование исключений C ++: попробуйте блокировать catch.Но освобождение динамической памяти будет проблемой при возникновении исключения.
@ see RAII.
Исключения должны быть вашим предпочтительным методом решения исключительных ситуаций времени выполнения, таких как нехватка памяти,Обратите внимание, что что-то вроде std :: map :: find не выдает (и не должно), потому что это не обязательно ошибка или особенно исключительный случай для поиска ключа, который не существует: функция может сообщить клиенту,или нет ключ существует.Это не нарушение предусловия или постусловия, как требование наличия файла для правильной работы программы и обнаружение, что файла там нет.
Красота обработки исключений, есливы делаете это правильно (опять же, @see RAII), то есть избегаете необходимости засорять код обработки ошибок по всей вашей системе.
Давайте рассмотрим случай, когда функция A вызывает функцию B, которая вызывает C, а затем D ии так далее, вплоть до «Z».Z - единственная функция, которая может генерировать, а A - единственная, заинтересованная в восстановлении после ошибки (A - точка входа для операции высокого уровня, например, такой как загрузка изображения).Если вы придерживаетесь RAII, который будет полезен не только для обработки исключений, то вам нужно всего лишь поместить строку кода в Z, чтобы вызвать исключение, и небольшой блок try / catch в A, чтобы перехватить исключение и, скажем, отобразитьсообщение об ошибке пользователю.
К сожалению, многие люди не придерживаются RAII так строго, как следовало бы на практике, поэтому во многих реальных кодах больше блоков try / catch, чем необходимо дляиметь дело с ручной очисткой ресурса (которая не должна быть ручной).Тем не менее, это идеал, которого вы должны стремиться достичь в своем коде, и он более практичен, если это проект среднего размера.Аналогично, в реальных сценариях люди часто игнорируют коды ошибок, возвращаемые функциями.если вы собираетесь приложить дополнительные усилия в пользу надежности, вы также можете начать с RAII, потому что это поможет вашему приложению независимо от того, используете ли вы обработку исключений или обработку кода ошибки.
Существует предупреждение: вы не должны выбрасывать исключения через границы модуля.Если вы это сделаете, вы должны рассмотреть гибрид между кодами ошибок (как при возврате кодов ошибок, не используя глобальный статус ошибки, например, errno) и исключениями.
Стоит отметить, что если вы используете оператор new в своем коде, не указав nothrow везде, например:
int* p = new int(123); // can throw std::bad_alloc
int* p = new(std::nothrow) int(123); // returns a null pointer on failure
... тогда вам уже нужно отлавливать и обрабатывать исключения bad_alloc в вашемкод для обеспечения его устойчивости к исключениям нехватки памяти.