Почему бы не использовать слово ошибка вместо исключения? [закрыто]

18

Если мы ссылаемся на исключения как на ошибки, почему бы просто не назвать это ошибкой, а не исключением?

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

Спасибо за любой ответ или комментарий.

Никлас
источник
Я надеюсь, что технические детали, которые я упомянул, помогут прояснить различие между исключением и ошибкой. Большой вопрос BTW, +1
Джереми Томпсон
1
Я на самом деле не знаю, как вы могли бы их спутать, потому что это очень разные вещи. Исключением являются случаи, обработанные кодом, которые указывают на какую-то ошибку. Как правило, ошибки расплывчатые, не совсем объяснимые и такие. - Хотя ошибки ... ошибка по определению не обрабатывается самим кодом. Они даже не ошибки, они указывают на отсутствие логики там, где этого не должно быть.
твк
1
@NiklasRtz: Почему огромная щедрость? Тонны людей ответили бы независимо.
ThePopMachine
@ThePopMachine Потому что мне нравятся огромные награды за вопросы, которые другие могут найти интересными. Я переписываю свои «популярные» вопросы и отвечаю как можно больше. Мне очень помогли хорошие и веселые вопросы и ответы. Я также готовлю новый вопрос об обработке ошибок и кодах ошибок для этих программистов. Это не конкретно, как писать код, а как обрабатывать ошибки ограниченным и, мы надеемся, стандартизированным способом, например, для веб-приложений, которые могут возвращать ограниченное количество коды ошибок, насколько хороши дела и названия частей кода.
Никлас

Ответы:

93

Ну, это довольно просто: не все исключения являются ошибками (и, аналогично, не все ошибки проявляют себя как исключения).

В качестве примера исключения это не ошибка, если вы читаете файл с USB-накопителя, а кто-то выдергивает диск из гнезда. Это вызовет исключение (в большинстве языков, которые поддерживают исключения). Но это не ошибка в коде.

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

Сказав это, исключение, которое пробивается до вершины стека, вероятно, является ошибкой. В приведенном выше примере с USB вы должны быть в состоянии перехватить это исключение и представить пользователю хорошую ошибку: «Мы не можем прочитать файл, потому что он больше не подключен». или что-то. Если вы просто представить их с IOExceptionи каким кодом ошибки фанка, то это ошибка. Но самого исключения нет.

Дин Хардинг
источник
1
Вы правы, даже когда я смотрю на то, как я это делаю: если метод не может получить название ближайшего города (Лос-Анджелес), он перехватывает исключение и возвращает имя более крупной административной области (например, Калифорния), но так как он применяется для любой координаты место без близкого города не ошибка, это исключение. Вы согласны?
Никлас
1
@Nicke: Да я бы с этим согласился.
Дин Хардинг
1
Представление IOException и кода ошибки не всегда является ошибкой. Это диагностика. Я часто делаю это для личных сценариев, где неудача означает, что я просто ввел неправильные аргументы.
Томас Эдинг
23

Просто и ясно, исключение не является (всегда) ошибкой!

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

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


источник
1
Хех, мы ответили почти в одно и то же время, и в основном с тем же примером :-)
Дин Хардинг
5
@DeanHarding Великие умы думают одинаково, да? : D
1
Хотя я согласен с вашим первым предложением, я должен не согласиться с вашим последним предложением. Первый компьютер ошибка (хотя апокрифические) была, по сути, моли в ловушке между точками реле. Чем отличается неисправный жесткий диск?
Скотт Уитлок
1
@ ScottWhitlock Я полагаю, что «ошибка» имеет более одного определения. Я всегда предполагал, что это означает ошибки, вызванные людьми: en.wikipedia.org/wiki/Software_bug
1
@ScottWhitlock: и, предположительно, программисты сказали бы: «Не моя вина, должна быть ошибка», что привело к обратному результату, поскольку «ошибка» означала программную ошибку. Сегодня аппаратный сбой нельзя назвать ошибкой, хотя ошибка может привести к аппаратному отказу.
Jmoreno
20

Они не одно и то же.

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

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

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

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

tdammers
источник
+1 для определения ваших условий. В общем, люди должны делать это чаще!
yfeldblum
Это определенно самый ясный ответ. очень ясно и кратко. Прекрасная работа!
Локк
5

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

DeadMG
источник
3

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

Примером, который приходит на ум, является InetAddress.getByName (), который используется для разрешения доменного имени. Если что-то происходит и генерируется исключение UnknownHostException, это не является проблемой кода.

Ник
источник
2

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

Исключения отличаются от ошибок. Каждый тип исключения (нарушение прав доступа, переполнение стека и т. Д.) Может быть вызван отладчиком как исключение «первого шанса» или «второго шанса». Исключения первого шанса по определению не являются фатальными, если они не обрабатываются должным образом с помощью обработчика ошибок, после чего они снова вызываются как исключение второго шанса (которое может обработать только отладчик).

Если ни один отладчик не обрабатывает второе случайное исключение, приложение закрывается.

Джереми Томпсон
источник
2

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

Алан Б
источник
это больше похоже на комментарий, см. Как ответить
gnat
1
Краткость не означает, что это не ответ, который подчеркивает разницу между этими двумя вещами.
Алан Б
1

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

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

Вот пример того, как не обработка исключения может быть ошибкой.

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

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

Раджат Сайни
источник
1

Сводка : исключения являются свидетельством плохих результатов, ошибки (некоторые из них) являются причинами плохих результатов. Проблема (подлежащая решению) - не исключение, проблема в том, что вызвало исключение.

Resoning: ошибка дефект в разработке или реализации продукта (не ограничивается программным обеспечением). Например, не использовать должным образом оцененное реле (время / чувствительность / надежность / емкость) либо из-за неверных характеристик, либо из-за простой ошибки сборки. Исключение представляет собой реальный мир / запустить отклонение времени от предсказывал (осмелюсь сказать , «ожидаемой»?) Поведение, например, потеря контроля над транспортным средством во время вождения.

Ясно, что ошибка может вызвать исключение, как пример в 1) может привести к примеру в 2). Но не все исключения будут вызваны ошибками, например потерей контроля над транспортным средством, потому что у оператора был удар.

Кристиан Х
источник
0

Поскольку этот вопрос был вновь открыт для вознаграждения, позвольте мне упомянуть мою статью CUJ от 2003 года, озаглавленную «Исключение или ошибка?», Которая, похоже, в точности отвечает на вопрос ОП.

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

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

Главное, что ошибки требуют совершенно противоположной стратегии, чем исключения.

Вышеупомянутая статья доступна сейчас от Dr.Dobb's по адресу: http://www.drdobbs.com/an-exception-or-a-bug/184401686

Миро Самек
источник