Существуют исключения, позволяющие обрабатывать исключения , которые могут избежать сбоев, но в более общем случае предотвращают нежелательное или непредсказуемое поведение системы. Например, если время подключения моей программы к базе данных истекает, это обычно не приводит к сбою системы, но если я зависел от данных из базы данных, исключение может позволить мне трактовать эту ситуацию без данных иначе, чем обычно.
Скажем, по умолчанию моя программа отображает страницу данных, основанную на том, что было возвращено из базы данных - ну дерьмо, у меня нет данных. Вместо представления испорченного представления или продолжения потенциально недопустимой операции я могу перехватить это исключение и вернуться к другой базе данных, прочитать локальные данные, запросить данные у пользователя или иным образом вернуть пользователя или систему в безопасное состояние (предположительно одно что не сразу вызовет такое же исключение!)
Кроме того, в системах, где пользовательский ввод может быть причиной / решением проблемы, исключения могут дать пользователю подробную и полезную информацию о проблеме. Вместо слишком распространенного «Необработанное исключение произошло в ...» или «Запугивающее сообщение об ошибке прямо из SQL» вы можете сказать пользователю что-нибудь полезное или хотя бы понятное, например «Не удалось подключиться к ресурсу B.»
Исключения были созданы для упрощения обработки ошибок. Без исключений логика обработки ошибок должна распространяться по всему приложению. Любая функция, которая может привести к ошибке, должна каким-то образом возвращать статус ошибки, и каждый вызов должен сопровождаться проверкой на наличие ошибок. Часто вызывающая сторона не может сделать ничего полезного в случае ошибки и может только вернуть саму ошибку. Половина кода приложения может быть посвящена обработке ошибок. Такой код чрезвычайно хрупок. Слишком легко пропустить проверку ошибок и сбой, или, что еще хуже, вернуть неверные результаты из-за незамеченной ошибки.
За исключением, ошибки могут быть проверены только в той точке, где они могут быть обработаны. Большая часть кода приложения может быть написана прямолинейно, поскольку функции либо возвращают полезное значение, либо выдают исключение.
источник
Точка исключения должна заключаться в информировании пользователя об исключительных обстоятельствах. Если с системой что-то пойдет не так, программа должна знать об этом и позволить ей * обрабатывать ее соответствующим образом.
Тем не менее, нет, исключение не существует для предотвращения "сбоя" системы. Исключение, которое дает мне понять, что есть проблема. То, как я действую, определяет, может ли система «зависать».
Также обратите внимание, что исключение не должно завершать приложение, как вы сказали. Исключение может быть обработано программистом и исправлено или превращено в какую-то значимую ошибку для пользователя.
* Использование проверенных исключений (исключений, которые вынуждены вылавливать) является больным местом. Некоторые (возможно, большинство) разработчиков считают, что принудительная обработка исключений является обременительной, ненужной и просто плохой практикой.
источник
Исключения допускают современную обработку ошибок путем отделения местоположения ошибки от обработчика ошибок. Иногда это также используется для управления потоком.
Необработанные исключения завершают программу. Но они ничем не отличаются от предыдущих исключений, просто ленивый программист, который забыл включить надлежащие обработчики ошибок в каждый путь, делает их видимыми для конечного пользователя. Я считаю, что программа, завершенная по исключению, завершилась так же, как и любой другой неожиданный конец.
Операционные системы очень хороши для очистки сбойных процессов, независимо от того, как они произошли, поэтому исключения не повышают безопасность ОС, кроме как прекращение работы сбойных процессов и освобождение их ресурсов.
источник
Это очень просто
До изобретения исключений каждая функция должна была возвращать код выхода (ошибка / успех), и любой результат или вывод из функции должен был быть получен путем передачи ей указателя на память, которую она должна установить.
Проблема заключалась в том, что многие программисты не помнили / не удосужились проверить ошибочные коды выхода для каждой отдельной функции, и поэтому фатальные ошибки иногда игнорировались, что приводило к совершенно необъяснимым действиям.
Поэтому было решено - при возникновении ошибки, которую вы не учли, немедленно вылетает! AKA Исключительная обработка.
источник
Исключения - это просто механизм обнаружения ошибок. Сами по себе они бесполезны.
Но, обнаруживая ошибку, они позволяют запускать механизмы отказоустойчивости для восстановления из ошибочного состояния путем переключения в безошибочное состояние (предыдущее состояние или новое). Таким образом, ошибка не распространяется на другие части системы.
источник
Существуют исключения для отделения нормального потока программы (для чего предназначена программа) от потока обработки ошибок (как программа пытается восстановиться в исключительной ситуации).
Это делает код более понятным и простым в обслуживании.
Рассмотрим два фрагмента кода:
По сравнению с этим:
Конечно, обработка исключений может использоваться для предотвращения сбоя программы:
но это не причина для исключений в современных языках программирования.
Вы также можете использовать
while
иbreak
вместо,if
но это не то, чтоwhile
иbreak
для.источник