Почему ошибки называются «Исключение», а не «Ошибка» в языках программирования?


45

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

Это может быть PageNotFoundErrorвместо PageNotFoundException.


41
Не все исключительные ситуации являются ошибками.
Эндрю Т Финнелл

15
Это разница между поворотом машины и поломкой машины.
Мировой инженер

6
Вы просто говорите об именах определенных классов исключений? Затем обратите внимание, что в некоторых экосистемах они называются XYError- например, в Python.

6
Напоминаем, что в Java есть класс Error, который наследуется от Throwable. См. Docs.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html для получения дополнительной информации. Вы также можете проверить категорию «Прямые известные подклассы».
luiscubal

Я хотел бы сказать, что эта головоломка не имеет ничего общего с английским языком. Это более логичная категоризация на любом разговорном языке, на котором вы решите быть опытным.
שינתיא אבישגנת

Ответы:


59

Они не должны быть ошибками вообще. Тот факт, что страницы нет, может быть просто интересным фактом, а не фактической ошибкой. Я признаю, что они почти всегда используются как ошибки. Но иногда они используются для выхода из циклов или для того, чтобы вы знали, что строка не является допустимым числом. Они могут использоваться для хранения и возврата огромного количества полезных данных - как часть довольно нормального возврата. (Некоторые языки немного медлительны со своими исключениями, в этом случае их частое выбрасывание - плохая идея.) В любом случае, теоретически исключение просто означает: «не делайте нормального возврата, поднимайтесь по стеку вызовов, пока не найдете кого-то заинтересованного». в этом."

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


27
Хотя использование механизмов исключения в качестве потока управления может сбивать с толку, и я думаю, что в целом это осуждают.
ChaosPandion

11
@ChaosPandion: зависит от языка / культуры.
Амара

11
@DocBrown: однажды я написал решатель судоку, который выполняет рекурсивный поиск, который возвращает назад, когда не удается найти решение в текущей попытке, и повторяет попытку с другим значением; и когда решение найдено, оно выдает исключение, содержащее решение. Проблема здесь провал - это «нормальная» ситуация, а успех - «исключительная» ситуация; и поскольку в решателе есть несколько точек, где он вызывает себя, без исключения вам придется написать множество шаблонов для проверки того, возвращается ли вызов в результате успешного поиска или неудачного поиска.
Ли Райан

5
@Falcon: да, вы можете просто вернуть «готовое» значение, что означает, что каждый раз, когда вы выполняете рекурсию, вам придется делать это: for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}но учитывая, что в коде есть несколько точек, где функция func () рекурсивна, Решение без исключений становится ужаснее каждый раз, когда вы добавляете больше рекурсии. Это то, что я называю культовым программированием, это, по сути, симуляция исключений в языке, который уже есть, потому что лидер культа говорит: «Вы не должны использовать исключения».
Ли Райан

8
@Falcon: Ах ... фондовый аргумент «похоже на Goto», этот аргумент работает для того, чтобы говорить, что вы не должны использовать циклы или операторы или вызовы функций, потому что «все они похожи на gotos». Возвращение успеха с исключением - это только WTF, если вы связываете исключение с ошибками. Для меня, когда используется таким образом, блок try-catch - это как «обещание вернуться сюда после долгого пути», поведение try-исключением + throw очень похоже на возврат функций-вызовов +, за исключением того, что гораздо более длительные поездки, которые могут потребовать очень глубокого стека вызовов, когда вы завершите поиск решения.
Ли Райан

21

Механизм исключений не всегда используется для сигнализации об ошибках. Исключения возникают из обычных ситуаций, которые требуют отдельного пути к коду для обработки, включая ошибки. Например, пользователь, предоставляющий имя файла, который не существует, или вводящий букву вместо цифры в числовом поле, являются исключительными ситуациями, требующими специальной обработки, но это не ошибки.

В некоторых средах программирования, таких как Java, предоставляются специальные Errorобъекты для сообщения об «истинных ошибках», ситуации, которые не должно пытаться обрабатывать разумное приложение. Эти объекты доставляются с использованием того же механизма, который используется для доставки исключений, но они имеют особое значение сигналов о неисправимых ситуациях.


6

У меня нет этимологического исследования происхождения этого, но я могу понять, что использование термина «ошибка» может быть не точным во всех ситуациях; Кроме того, как уже упоминалось почтиSharepointMaster, лучше думать об ошибке и об исключении, которые выдают как отдельные объекты.

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

Впервые я увидел термин «исключение» в руководстве по сборке 80386. Я помню, что когда я увидел, это выглядело для меня мгновенно естественно Называть это ошибкой было бы некорректно, потому что в сборке нет ошибок; Есть просто условия, с которыми процессор не может справиться (если это ошибка - от программиста, пользователя или системы - ну, процессор совершенно не зависит от этого). Я не знаю, действительно ли Intel возник этот термин или нет, но, возможно, ...


3

Обычно Exception используется для именования события, которое является неправильным, но может быть восстановлено, как out_of_rangeисключение в C ++, которое выдается при доступе к элементу в векторе или массиве, который не существует. Очевидно, что такое событие не является правильным, но это не должно означать сбой всей вашей программы.

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


3

Я думаю, что это больше связано с «эволюцией» обработки ошибок. В языках C / C ++ (до добавления обработки исключений) в случае сбоя функции единственным способом определить это было возвращаемое значение (например, HRESULTв win32). Поэтому, как правило, вы в конечном итоге ловите коды завершения каждого вызова функции и делаете проверку. Такой подход делает код более грязным. И разработчики часто просто избегают добавлять эти проверки из-за лени.

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


2

В Python они называются ABCError, например: KeyError, IndexError

http://docs.python.org/library/exceptions.html

Поэтому я думаю, что это зависит от языка, который вы используете.


4
Не забывайте VB (классический, а не. Net). При ошибке использовался Goto. И самое удивительное изобретение всех времен «По ошибке возобновить дальше»
Кибби,

1
В Python ошибки являются подмножеством исключений. Существует четыре стандартных исключения, которые наследуются от Exception, но не наследуются от StandardError: StopIteration, GeneratorExit, KeyboardInterrupt и SystemExit.
Дирк Холсоппл

1

При возникновении ошибки либо система, либо выполняемое в настоящий момент приложение сообщает об этом, генерируя исключение, содержащее информацию об ошибке. После выдачи исключение обрабатывается приложением или обработчиком исключений по умолчанию.

Ошибка выдает исключение, которое детализирует ошибку, поэтому не все является ошибкой, которая является исключением, если это имеет смысл;), например, noneimplemetedexception не должно быть ошибкой, но выдает исключение.

http://msdn.microsoft.com/en-us/library/system.exception.aspx


0

В программировании на iOS / Mac у нас есть и исключения, и ошибки на одном языке.

По крайней мере, в этой среде исключение является «невосстановимым», а ошибка - «восстанавливаемой».

Например:

  • если у вас есть массив из 10 элементов, и вы пытаетесь получить доступ к элементу с индексом 30 - это будет исключением. Вы ошиблись в своем программировании.
  • если вы пытаетесь скачать URL, но нет подключения к интернету, этого и следовало ожидать, и вы должны представить какое-то сообщение пользователю.

Исключения обычно приводят к аварийному завершению работы приложения, в то время как ошибки обычно возвращаются nilи объект ошибки (возвращается как параметр метода ссылки). Вы можете перехватывать исключения с помощью блока try / catch / finally, но никогда не рекомендуется использовать эту языковую функцию - если возможно какое-либо восстановление после исключения, то вам вообще не следует генерировать исключение (вы должны вернуть объект ошибки вместо этого).


2
Ну, это совсем не то, что Exception и Errors предназначены для других разработчиков!
Тарик

Каждый язык отличается, я думаю. Objective-C / Cocoa - один из старейших языков активного использования (примерно с 1983 года), так что, возможно, он немного старомоден. Тем не менее, если определение меняется от одного сообщества к другому, важно знать это.
Абхи Беккерт

0

Ошибка является то , что пошло не так в выполнении программы. Часто это решается с помощью исключения , но

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

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

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


0

Исключения и ошибки разные.

Исключением являются ситуации, которые может преодолеть программа, например, если вы пытаетесь открыть файл, а он не существует, в то время как ошибки - это ситуации, с которыми программа ничего не может сделать, например сбой диска или сбой ОЗУ.


0

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

Таким образом, ответ на ваш вопрос: это зависит от контекста и перспективы.


0

Исключения развивались как обобщение ошибок. Первый язык программирования , чтобы включить механизм исключения был Lisp в начале 1970 - х годов. В книге «Паттерн эволюции языка » есть хорошее резюме Габриэля и Стила., Исключения (которые еще не назывались исключениями) возникли из-за необходимости указывать поведение программы в случае возникновения ошибки. Одна возможность - остановить программу, но это не всегда полезно. В реализациях Lisp традиционно был способ войти в отладчик при ошибке, но иногда программисты хотели включить обработку ошибок в свою программу. Таким образом, в реализациях Lisp 1960-х годов был способ сказать: «сделай это, и если произойдет ошибка, сделай это вместо этого». Первоначально ошибки исходили из примитивных функций, но программисты сочли удобным преднамеренно вызвать ошибку, чтобы пропустить некоторую часть программы и перейти к обработчику ошибок.

В 1972 году современная форма обработки исключений в Lisp появилась в MacLisp: throwи catch. Группа по сохранению программного обеспечения перечисляет много материалов о ранних реализациях Lisp, включая Редакцию 0 Справочного руководства MACLISP Дэвида Муна . Примитивы catchи throwдокументированы в §5.3 с.43.

catchявляется функцией LISP для выполнения структурированных нелокальных выходов (catch x)оценивает xи возвращает его значения, за исключением того, что если во время оценки x (throw y)следует оценивать, catchнемедленно возвращается yбез дальнейшей оценки x.

catchможет также использоваться со вторым аргументом, не оцененным, который используется в качестве тега для различения вложенных уловов. (...)

throwиспользуется catchв качестве структурированного нелокального механизма выхода.

(throw x)оценивает xи выбрасывает значение обратно к самому последнему catch.

(throw x <tag>)бросает значение xназад в самое последнее, catchпомеченное <tag>или немаркированное.

Основное внимание уделяется нелокальному управлению потоком. Это форма goto (goto-only goto), которая также называется прыжком . Метафора заключается в том, что одна часть программы выдает значение для возврата в обработчик исключений, а обработчик исключений перехватывает это значение и возвращает его.

Большинство языков программирования сегодня упаковывают тег и значение в объект исключения и комбинируют механизм перехвата с механизмом обработки.

Исключения не обязательно являются ошибками. Это способ выхода из блока кода и из окружающих блоков, экранирование до тех пор, пока не будет достигнут обработчик для исключения. Считается ли такая вещь «ошибкой» в интуитивном смысле, субъективно.

В некоторых языках проводится различие между терминами «ошибка» и «исключение». Например, некоторые диалекты Lisp должны как throwвызывать исключение (поток управления для пользователей, предназначенный для выполнения нелокального выхода, который не указывает, что что-то пошло не так), так и signalвыдавать ошибку (которая указывает, что что-то пошло не так и может вызвать событие отладки).


-1

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


-1

Ошибка - это всегда ошибка. Исключением является ошибка в текущем контексте. То есть исключение является контекстно-зависимым. Примером исключения может быть добавление ascii "a" к целому числу "1". Ошибка может быть что-то вроде использования неопределенного оператора, такого как "+!" на большинстве языков.

Некоторые языки позволят вам определить свой выход из ситуации, если это действительно то, что вы хотите сделать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.