Я долго об этом думал. Я сам не являюсь носителем английского языка, но все же имею многолетний опыт программирования, и я всегда спрашивал меня об этом. Почему он называется Исключением, а не ошибкой, поскольку они являются ошибками.
Это может быть PageNotFoundError
вместо PageNotFoundException
.
XYError
- например, в Python.Ответы:
Они не должны быть ошибками вообще. Тот факт, что страницы нет, может быть просто интересным фактом, а не фактической ошибкой. Я признаю, что они почти всегда используются как ошибки. Но иногда они используются для выхода из циклов или для того, чтобы вы знали, что строка не является допустимым числом. Они могут использоваться для хранения и возврата огромного количества полезных данных - как часть довольно нормального возврата. (Некоторые языки немного медлительны со своими исключениями, в этом случае их частое выбрасывание - плохая идея.) В любом случае, теоретически исключение просто означает: «не делайте нормального возврата, поднимайтесь по стеку вызовов, пока не найдете кого-то заинтересованного». в этом."
Даже исключение нулевого указателя может не иметь большого значения для вас. Вы вызываете чужой код, а затем перехватываете исключение нулевого указателя, потому что знаете, что оно может взорваться, печатаете сообщение о том, чья это вина, и продолжаете и выполняете свою работу.
источник
for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}
но учитывая, что в коде есть несколько точек, где функция func () рекурсивна, Решение без исключений становится ужаснее каждый раз, когда вы добавляете больше рекурсии. Это то, что я называю культовым программированием, это, по сути, симуляция исключений в языке, который уже есть, потому что лидер культа говорит: «Вы не должны использовать исключения».Механизм исключений не всегда используется для сигнализации об ошибках. Исключения возникают из обычных ситуаций, которые требуют отдельного пути к коду для обработки, включая ошибки. Например, пользователь, предоставляющий имя файла, который не существует, или вводящий букву вместо цифры в числовом поле, являются исключительными ситуациями, требующими специальной обработки, но это не ошибки.
В некоторых средах программирования, таких как Java, предоставляются специальные
Error
объекты для сообщения об «истинных ошибках», ситуации, которые не должно пытаться обрабатывать разумное приложение. Эти объекты доставляются с использованием того же механизма, который используется для доставки исключений, но они имеют особое значение сигналов о неисправимых ситуациях.источник
У меня нет этимологического исследования происхождения этого, но я могу понять, что использование термина «ошибка» может быть не точным во всех ситуациях; Кроме того, как уже упоминалось почтиSharepointMaster, лучше думать об ошибке и об исключении, которые выдают как отдельные объекты.
Когда вы говорите на языке программирования высокого уровня, имеет смысл предположить, что исключение всегда вызывается ошибкой, хотя я также согласен с dasblinkenlight, что даже тогда исключение не всегда является следствием ошибки. Я, например, использую исключения для совместного завершения потоков.
Впервые я увидел термин «исключение» в руководстве по сборке 80386. Я помню, что когда я увидел, это выглядело для меня мгновенно естественно Называть это ошибкой было бы некорректно, потому что в сборке нет ошибок; Есть просто условия, с которыми процессор не может справиться (если это ошибка - от программиста, пользователя или системы - ну, процессор совершенно не зависит от этого). Я не знаю, действительно ли Intel возник этот термин или нет, но, возможно, ...
источник
Обычно Exception используется для именования события, которое является неправильным, но может быть восстановлено, как
out_of_range
исключение в C ++, которое выдается при доступе к элементу в векторе или массиве, который не существует. Очевидно, что такое событие не является правильным, но это не должно означать сбой всей вашей программы.С другой стороны, ошибки обычно используются для именования чего-то, что должно все разрушать, что-то вроде переполнения стека является примером события, которое должно завершить программу, поскольку программа не может обработать это внутренне. Другими словами: ошибка является серьезной, а исключение сравнительно незначительным.
источник
Я думаю, что это больше связано с «эволюцией» обработки ошибок. В языках C / C ++ (до добавления обработки исключений) в случае сбоя функции единственным способом определить это было возвращаемое значение (например,
HRESULT
в win32). Поэтому, как правило, вы в конечном итоге ловите коды завершения каждого вызова функции и делаете проверку. Такой подход делает код более грязным. И разработчики часто просто избегают добавлять эти проверки из-за лени.С введением обработки исключений у разработчиков теперь было два варианта сообщения об ошибке. Таким образом, слово «исключение» использовалось, чтобы отличать ошибки от ошибок «выход из состояния». По прошествии некоторого времени обработка исключений стала популярным способом распространения ошибок, потому что код гораздо легче читать, поддерживать и может существовать единственное место, где вы можете иметь логику обработки ошибок.
источник
В Python они называются ABCError, например: KeyError, IndexError
http://docs.python.org/library/exceptions.html
Поэтому я думаю, что это зависит от языка, который вы используете.
источник
При возникновении ошибки либо система, либо выполняемое в настоящий момент приложение сообщает об этом, генерируя исключение, содержащее информацию об ошибке. После выдачи исключение обрабатывается приложением или обработчиком исключений по умолчанию.
Ошибка выдает исключение, которое детализирует ошибку, поэтому не все является ошибкой, которая является исключением, если это имеет смысл;), например, noneimplemetedexception не должно быть ошибкой, но выдает исключение.
http://msdn.microsoft.com/en-us/library/system.exception.aspx
источник
В программировании на iOS / Mac у нас есть и исключения, и ошибки на одном языке.
По крайней мере, в этой среде исключение является «невосстановимым», а ошибка - «восстанавливаемой».
Например:
Исключения обычно приводят к аварийному завершению работы приложения, в то время как ошибки обычно возвращаются
nil
и объект ошибки (возвращается как параметр метода ссылки). Вы можете перехватывать исключения с помощью блока try / catch / finally, но никогда не рекомендуется использовать эту языковую функцию - если возможно какое-либо восстановление после исключения, то вам вообще не следует генерировать исключение (вы должны вернуть объект ошибки вместо этого).источник
Ошибка является то , что пошло не так в выполнении программы. Часто это решается с помощью исключения , но
Ошибка - это семантическое понятие: оно применяется программистом или пользователем, который приходит в программу с ожиданиями, чтобы описать разницу между их ожиданиями и реальностью. Только человек может сказать, находится ли подпрограмма в состоянии ошибки или нет.
Исключением является синтаксическая концепция: это нечто в самой программе, независимо от чьих-либо ожиданий относительно того, что эта программа должна делать. Рутина или делает или не вызывает исключение, независимо от того, что кто-то думает.
источник
Исключения и ошибки разные.
Исключением являются ситуации, которые может преодолеть программа, например, если вы пытаетесь открыть файл, а он не существует, в то время как ошибки - это ситуации, с которыми программа ничего не может сделать, например сбой диска или сбой ОЗУ.
источник
Возбуждение и обработка исключений являются функциями потока управления, и название исключения должно следовать за предполагаемым использованием. Разработчик кода и API должен найти хорошие и согласованные схемы именования.
Таким образом, ответ на ваш вопрос: это зависит от контекста и перспективы.
источник
Исключения развивались как обобщение ошибок. Первый язык программирования , чтобы включить механизм исключения был Lisp в начале 1970 - х годов. В книге «Паттерн эволюции языка » есть хорошее резюме Габриэля и Стила., Исключения (которые еще не назывались исключениями) возникли из-за необходимости указывать поведение программы в случае возникновения ошибки. Одна возможность - остановить программу, но это не всегда полезно. В реализациях Lisp традиционно был способ войти в отладчик при ошибке, но иногда программисты хотели включить обработку ошибок в свою программу. Таким образом, в реализациях Lisp 1960-х годов был способ сказать: «сделай это, и если произойдет ошибка, сделай это вместо этого». Первоначально ошибки исходили из примитивных функций, но программисты сочли удобным преднамеренно вызвать ошибку, чтобы пропустить некоторую часть программы и перейти к обработчику ошибок.
В 1972 году современная форма обработки исключений в Lisp появилась в MacLisp:
throw
иcatch
. Группа по сохранению программного обеспечения перечисляет много материалов о ранних реализациях Lisp, включая Редакцию 0 Справочного руководства MACLISP Дэвида Муна . Примитивыcatch
иthrow
документированы в §5.3 с.43.Основное внимание уделяется нелокальному управлению потоком. Это форма goto (goto-only goto), которая также называется прыжком . Метафора заключается в том, что одна часть программы выдает значение для возврата в обработчик исключений, а обработчик исключений перехватывает это значение и возвращает его.
Большинство языков программирования сегодня упаковывают тег и значение в объект исключения и комбинируют механизм перехвата с механизмом обработки.
Исключения не обязательно являются ошибками. Это способ выхода из блока кода и из окружающих блоков, экранирование до тех пор, пока не будет достигнут обработчик для исключения. Считается ли такая вещь «ошибкой» в интуитивном смысле, субъективно.
В некоторых языках проводится различие между терминами «ошибка» и «исключение». Например, некоторые диалекты Lisp должны как
throw
вызывать исключение (поток управления для пользователей, предназначенный для выполнения нелокального выхода, который не указывает, что что-то пошло не так), так иsignal
выдавать ошибку (которая указывает, что что-то пошло не так и может вызвать событие отладки).источник
Вы найдете это по-разному интерпретируемым в различных реализациях языка программирования. Как сказал dasblinkenlight, это явная точка зрения о наличии разграничения между ошибкой и исключением. Во многих языках программирования исключения являются нарушениями, которые могут быть обработаны или разрешены для создания пузырей для передачи на максимально возможный программный модуль. Как правило, ошибки - это ситуации, когда контейнер языка времени выполнения вашего языка обрабатывает (а во многих случаях просто останавливает выполнение).
источник
Ошибка - это всегда ошибка. Исключением является ошибка в текущем контексте. То есть исключение является контекстно-зависимым. Примером исключения может быть добавление ascii "a" к целому числу "1". Ошибка может быть что-то вроде использования неопределенного оператора, такого как "+!" на большинстве языков.
Некоторые языки позволят вам определить свой выход из ситуации, если это действительно то, что вы хотите сделать.
источник