Деление на ноль - ошибка или исключение? - PullRequest
3 голосов
/ 25 марта 2011

В основном я хочу знать, как вы отличаете ошибку от исключения.В некоторых языках программирования доступ к несуществующему файлу вызывает ошибку, а в других - исключение.Как узнать, является ли какая-то вещь ошибкой или исключением?

Ответы [ 4 ]

2 голосов
/ 25 марта 2011

Как и все остальное - вы либо тестируете его, либо читаете документацию.Это может быть «Ошибка» или «Исключение» в зависимости от языка.

Например:

C:

Сбои и делениепо нулевой ошибке.

Ruby:

>> 6 / 0
ZeroDivisionError: divided by 0
from (irb):1:in `/'
from (irb):1

(ZeroDivisionError на самом деле является исключением.)

Java:

Код:

int x = 6 / 0;

Выход:

Exception in thread "main" java.lang.ArithmeticException: / by zero
1 голос
/ 26 марта 2011

Термины ошибка и исключение обычно используются как жаргонные термины, значения которых варьируются в зависимости от экосистемы программирования, в которой они используются.

Условия

Этот ответ следует за Common Lisp и принимает термин условие в качестве необоснованного способа ссылки на "интересную ситуацию" в программе.

Что делает условие программы "интересным"? Давайте рассмотрим случай деления на ноль для действительных чисел. В подавляющем большинстве случаев, когда одно действительное делится на другое, результатом является другое обычное действительное число с хорошим поведением. Это «рутинные» или «неинтересные» случаи. Однако в случае, когда делитель равен нулю, математически говоря, результат не определен. Программа сейчас находится в «интересном» или «исключительном» состоянии.

Это становится еще сложнее, когда мы берем математический идеал действительного числа и моделируем его, скажем, как число с плавающей точкой в ​​формате IEEE . Если мы разделим 1.0 / 0.0, стандарт IEEE (в основном) говорит, что результатом является фактически другое число с плавающей запятой, тихое NaN Infinity . Поскольку результат больше не ведет себя так же, как простое старое действительное число, условие программы снова «интересное» или «исключительное».

Условия классификации

Вопрос в том, что мы должны делать, когда сталкиваемся с интересным состоянием? Ответ зависит от контекста. При классификации условий программы полезны следующие вопросы:

  1. Насколько вероятно, что возникнет условие: определенное, вероятное, маловероятное, невозможное?
  2. Как определяется условие: сбой программы, различающееся значение, сигнал / обработчик (он же обработка исключений ), завершение программы?
  3. Как следует обрабатывать условие: игнорировать его, выполнить какое-то специальное действие, завершить программу?

Ответы на эти вопросы дают 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 предназначены для восстанавливаемых условий и далее подразделяются на проверенные исключения (для вероятных условий) и непроверенные исключения (для маловероятных условий). К сожалению, границы между этими категориями плохо определены, и вы часто будете находить случаи метаний, семантика которых предполагает, что они принадлежат к другой категории.

Остерегайтесь жаргона

Эти примеры показывают, что значения ошибка и исключение в лучшем случае мутные. Нужно трактовать ошибка и исключение как жаргон, значение которого определяется контекстом обсуждения.

Большую ценность представляют отличительные характеристики программных условий. Какова вероятность возникновения состояния? Как определяется состояние? Какие действия следует предпринять при обнаружении состояния? В любом обсуждении, которое требует ясности, лучше подходить для прямого ответа на эти вопросы, чем полагаться на терминологию жаргона.

1 голос
/ 25 марта 2011

Это зависит от языка :

  • некоторые языки не имеют исключений
  • некоторые языки не используют исключения для всего.


Например, в PHP:

  • Существуют исключения
  • Но деление на 0 не вызывает выбрасывания исключения: только вызываетпредупреждение - это не останавливает выполнение скрипта.

Следующая часть кода:

echo 10 / 0;
echo "hello, world!";

выдаст такой результат:

Warning: Division by zero in /.../temp.php on line 5
hello, world!
0 голосов
/ 25 марта 2011

Исключения должны указывать на исключительную активность, поэтому, если вы достигнете точки в своем коде, для которой вы сделали все возможное, чтобы избежать деления на ноль, тогда выбрасывание исключения (если вы умеете на своем языке) - правильный путь..

Если это обычная логика для проверки деления на ноль (как для приложения калькулятора), то вы должны проверить это в своем коде, прежде чем у него появится возможность вызвать исключение.В этом случае это ошибка (при вводе пользователем) и должна обрабатываться как таковая.

(украл эту идею либо у Pragmatic Programmer, либо у Code Complete; не могу вспомнить, какая именно.)

...