Термины ошибка и исключение обычно используются как жаргонные термины, значения которых варьируются в зависимости от экосистемы программирования, в которой они используются.
Условия
Этот ответ следует за Common Lisp и принимает термин условие в качестве необоснованного способа ссылки на "интересную ситуацию" в программе.
Что делает условие программы "интересным"? Давайте рассмотрим случай деления на ноль для действительных чисел. В подавляющем большинстве случаев, когда одно действительное делится на другое, результатом является другое обычное действительное число с хорошим поведением. Это «рутинные» или «неинтересные» случаи. Однако в случае, когда делитель равен нулю, математически говоря, результат не определен. Программа сейчас находится в «интересном» или «исключительном» состоянии.
Это становится еще сложнее, когда мы берем математический идеал действительного числа и моделируем его, скажем, как число с плавающей точкой в формате IEEE . Если мы разделим 1.0 / 0.0, стандарт IEEE (в основном) говорит, что результатом является фактически другое число с плавающей запятой, тихое NaN Infinity . Поскольку результат больше не ведет себя так же, как простое старое действительное число, условие программы снова «интересное» или «исключительное».
Условия классификации
Вопрос в том, что мы должны делать, когда сталкиваемся с интересным состоянием? Ответ зависит от контекста. При классификации условий программы полезны следующие вопросы:
- Насколько вероятно, что возникнет условие: определенное, вероятное, маловероятное, невозможное?
- Как определяется условие: сбой программы, различающееся значение, сигнал / обработчик (он же обработка исключений ), завершение программы?
- Как следует обрабатывать условие: игнорировать его, выполнить какое-то специальное действие, завершить программу?
Ответы на эти вопросы дают 4 x 4 x 3 = 48 различных случаев - и, конечно, больше можно выделить по другим критериям. Это подводит нас к сути дела. У нас есть более двух случаев, но только две метки, ошибка и исключение , для применения к ним. Само собой разумеется, есть много возможных способов разделить 48+ случаев на две группы.
Например, можно сказать, что что-либо, связанное с неисправностью программы, является ошибкой , все остальное - исключение . Или что все, что связано со встроенными в язык средствами обработки исключений средствами, является исключением , все остальное - ошибка . Возможности легион.
Примеры
End-Of-File
При считывании и обработке потока символов обязательно попадание в конец файла. В C это событие обнаруживается с помощью различимого возвращаемого значения из функции ввода-вывода, так называемого error возвращаемого значения. Таким образом, говорят об ошибке EOF .
Отдел-By-Zero
При делении двух введенных пользователем чисел в простой программе калькулятора мы хотим получить значимый результат, даже если пользователь вводит делитель нуля. В некоторых средах C деление на ноль приводит к сигналу ( SIGFPE ), который должен быть обработан обработчиком сигнала. Сигналы иногда называют исключениями в сообществе C и, как ни странно, иногда называют программными ошибками сигналов. В других средах C применяются правила IEEE с плавающей точкой, и деление на ноль приведет к значению NaN. Окружающая среда C, к счастью, не знает об этом значении, считая, что оно не является ни исключением , ни ошибкой .
Ошибка загрузки во время выполнения
Программы часто загружают программный код динамически во время выполнения (например, классы, библиотеки DLL). Это может произойти сбой из-за отсутствия файла. C не предлагает никакого стандартного способа обнаружения или восстановления после этого случая. Программа будет принудительно завершена, и часто говорят об этой ситуации как о фатальном исключении . В Java это можно назвать связью error .
Java Throwable Иерархия
Система обработки исключений в Java делит так называемую иерархию классов Throwable на две основные группы. Подклассы Error
предназначены для представления условий, из которых восстановление невозможно. Подклассы Exception
предназначены для восстанавливаемых условий и далее подразделяются на проверенные исключения (для вероятных условий) и непроверенные исключения (для маловероятных условий). К сожалению, границы между этими категориями плохо определены, и вы часто будете находить случаи метаний, семантика которых предполагает, что они принадлежат к другой категории.
Остерегайтесь жаргона
Эти примеры показывают, что значения ошибка и исключение в лучшем случае мутные. Нужно трактовать ошибка и исключение как жаргон, значение которого определяется контекстом обсуждения.
Большую ценность представляют отличительные характеристики программных условий. Какова вероятность возникновения состояния? Как определяется состояние? Какие действия следует предпринять при обнаружении состояния? В любом обсуждении, которое требует ясности, лучше подходить для прямого ответа на эти вопросы, чем полагаться на терминологию жаргона.