Чому б не використовувати слово помилка замість винятку? [зачинено]


18

Якщо ми називаємо винятки помилками, то чому б просто не називати її помилкою в першу чергу замість виключення?

Якщо в коді він називається винятком, і як тільки він виникає, він називається помилкою. Тоді чому б не назвати це помилкою в першу чергу?

Дякую за будь-яку відповідь чи коментар.


Я сподіваюся, що технічні деталі, які я згадую, допоможуть уточнити відмінність виключення від помилки. Відмінне запитання BTW, +1
Джеремі Томпсон


1
Я насправді не знаю, як ви могли їх сплутати, оскільки це дуже різні речі. Виняток становлять випадки, оброблені кодом, які вказують на якусь помилку. Зазвичай помилки невиразного типу, не зовсім пояснювані, і такі. - Хоча помилки ... помилка за визначенням не обробляється самим кодом. Це навіть не помилки, вони вказують на відсутність логіки там, де цього не повинно бути.
tvCa

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

І навпаки, наявність помилки не обов'язково виявляється як виняток. Додаток може мовчки відкидати дані, які ви вводите, замість того, щоб зберігати їх у своїй базі даних; не виняток кидається, але це все-таки помилка.


+1 для визначення ваших умов. Взагалі люди повинні робити це частіше!
yfeldblum

Це, безумовно, найясніша відповідь. дуже чіткий і стислий. Чудова робота!
Локк

5

Винятки та помилки зовсім не пов'язані. Звичайно, іноді ви кидаєте виняток, і це означає помилку. Але іноді це просто означає виняткову, незвичну обставину, яка зовсім не обов’язково помилка в програмі. Особливо у такій мові, як щасливий виняток, як Java, де кожна стандартна операція та собака кидає приблизно п’ять різних винятків - наприклад, відкриття файлу не вдалося, файл читання не вдався тощо.


3

Винятки не завжди пов’язані з помилками. Подумайте про це як про щось, що може піти не так у тому, що ви робите.

Приклад, який спадає на думку, - це InetAddress.getByName (), який використовується для вирішення доменного імені. Якщо щось трапляється, і UnknownHostException кидається, це насправді не проблема коду.


2

Помилка програмного забезпечення - це загальний термін, що використовується для опису помилки, помилки, помилки, відмови чи несправності в комп'ютерній програмі чи системі, яка дає невірний або несподіваний результат або викликає поведінку ненавмисно. Це може бути навіть орфографічною помилкою на етикетці.

Винятки відрізняються від помилок. Кожен виняток (порушення доступу, переповнення стека тощо) може бути підвищений до налагоджувача як виняток "перший шанс" або "другий шанс". Винятки з першого шансу, за визначенням, не є фатальними, якщо з ними не обробляються належним чином з оброблювачем помилок, і тоді вони знову піднімаються як виняток другого шансу (який може впоратися лише налагоджувач).

Якщо жоден налагоджувач не обробляє виняток з другого шансу, програма закривається.


2

Ви можете законно підняти виняток самостійно, сподіваємось, ніколи не вводите помилку навмисно.


це читається більше як коментар, див. Як відповісти
gnat

1
Стислість не означає, що це не відповідь, яка висвітлює різницю між двома речами.
Алан Б

1

Усі винятки - це не помилки. Може бути темою дискусій, що всі помилки є винятками чи ні.

Ми можемо сказати, що винятки - це події, які не є частиною нормального або очікуваного потоку заявок. Ці події можуть бути незалежними від того, як написаний код, коли помилка є результатом поганого коду (наприклад, неправильного обчислення).

Ось приклад того, як не обробляти виняток може бути помилка.

Припустимо, існує програма, яка записує деякі дані на зовнішній запам'ятовуючий пристрій. Під час запису зовнішній запам'ятовуючий пристрій був відключений, вийшов з ладу або може бути знищений (з будь-якої причини). Зараз це винятковий випадок, тепер незалежно від мови програмування підтримується виняткове керування чи ні, якщо програма виходить з ладу або погано поводиться через цю подію, це помилка. . Але якщо програма граціозно припиняє процес, повідомте про це користувача (іншими словами, обробляйте його), це явно не помилка.

Мови програмування «Маханізм спробувати» - це, по суті, інструмент для полегшення нашого виходу з несподіваних подій.


1

Конспект : Винятки є свідченням поганих результатів, помилки (деякі з) причини поганих результатів. Проблема (яка повинна бути вирішена) не є винятком, проблема є причиною винятку.

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

Зрозуміло, що помилка може спричинити виняток, оскільки приклад у 1) може призвести до прикладу в 2). Але не всі винятки були спричинені помилками, наприклад, втратою контролю над транспортним засобом, оскільки оператор зазнав інсульту.


0

Оскільки це питання було відкрито для виграшу, дозвольте мені згадати мою статтю CUJ від 2003 року під назвою "Виняток чи помилка?", Яка, здається, вирішує саме питання ОП.

В основному стаття визначає терміни "помилка" та "виняток" (наводячи приклади) та пропонує стратегії поводження з кожним.

У статті пропонується не "обробляти" помилки, а натомість позначити їх твердженнями. Навпаки, справжні винятки вимагають керування кодом (можливо, викидання / вилучення винятків).

Головне - помилки вимагають точно протилежної стратегії, ніж винятки.

Вищезазначена стаття зараз доступна від Dr.Dobb's за адресою: http://www.drdobbs.com/an-exception-or-a-bug/184401686

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.