Чи є в основному винятки, щоб запобігти збоїв у роботі системи?


16

По-друге, мені було цікаво, чи хтось знає, у чому різниця між винятками (у царині потоку управління винятками) та Винятками (наприклад, що використовується у Java).

Але чи є вони в основному для захисту системи від збоїв шляхом припинення користувальницької програми?

Відповіді:


29

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

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

Крім того, у системах, де введення користувача може бути причиною / рішенням проблеми, винятки можуть повідомити користувачу про детальну та корисну інформацію про проблему. Замість занадто поширеного "Неопрацьоване виняток сталося в ..." або "Залякування повідомлення про помилку прямо з SQL", ви можете сказати користувачеві щось корисне або принаймні зрозуміле, наприклад "Не вдалося підключитися до ресурсу B."


5
Я вважаю, що це найточніша відповідь. Програми - це кінцеві автомати, які працюють. Існують способи зламати машину, ввівши погані дані, що призведе до її несправності. Для запобігання цьому кидаються винятки. Іноді машина може відновити себе, але іноді не може.
Енді

1
Не можу я зробити те саме, що з кодами помилок? Ви повертаєте помилку, і я її виправляю.
mskw

16

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

За винятком, помилки можна перевірити лише в тому місці, де їх можна обробити. Більшість кодів програми можна писати прямолінійно, оскільки функції або повернуть корисне значення, або викинуть виняток.


5

Суть винятку повинна полягати в повідомленні користувача про виняткові обставини. Якщо з системою щось не вдається, програма повинна знати і дозволити їй обробляти * належним чином.

Однак сказане: ні, винятку не існує, щоб запобігти "збоям" системи. Виняток він дає мені знати, що є проблема. Як діяти визначає, можна визначити, чи система "виходить з ладу".

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


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


2
Я не згоден, це визначення занадто обмежене. Користувачеві завжди повинно відображатися лише підмножина винятків. Винятки становлять поводження з помилками, а відмова та інформування користувача - це останній крок, який зазвичай робиться, і це не повинно бути нормою. Деякі системи покликані використовувати винятки і для деяких видів контролю потоку, наприклад, кінець ітерабельного, EOF тощо.
Jürgen Strobel

Юрген, я розумію і повністю згоден з вашим коментарем. "виправлено чи перетворилося на якусь змістовну помилку" - Чи не передаю я цю думку з цим твердженням?

Так, зараз набагато краще.
Юрген Стробель

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

2

Винятки дозволяють сучасне поводження з помилками, розділяючи місце помилки від обробника помилок. Іноді це також використовується для контролю потоку.

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

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


Є обмеження щодо того, що може очистити операційна система. Взагалі ОС не може знати, чи потрібно чисті постійні ресурси (наприклад, файли) очищати чи повертати назад, а також не може знати, чи потрібна чистка для віддаленого з'єднання, крім простого закриття з'єднання на локальній стороні.
8bittree

2

Це дуже просто.

  • Для краху програми та не всієї системи - у нас є [хороші] Операційні системи.
  • Збій програми замість ігнорування фатальної помилки - у нас є винятки.

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

Проблема полягала в тому, що багато програмістів не пам’ятали / не намагалися перевіряти помилкові коди виходу для кожної окремої функції, а значить, фатальні помилки іноді ігнорувались, що призводило до досить незрозумілої поведінки.

Тому було вирішено - коли трапиться помилка, яку ви не брали до уваги, негайно зазнайте аварії! Обробка винятків AKA.


1

Винятки - це просто механізм виявлення помилок. Самі по собі вони не приносять користі.

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


0

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

Це робить код більш зрозумілим і легшим у обслуговуванні.

Розглянемо два фрагменти коду:

try:
    do1()  # this is obvoiusly a normal
    do2()  # program flow
except:
    oups()  # this is exception handling code

Порівняно з цим:

if foo():
    thing1()  # is this part of normal program flow?
else:
    thing2()  # or maybe this one? Or both? When?

Звичайно, обробка винятків може використовуватися для запобігання збоїв програми:

try {    // very bad code
    my();
    whole();
    ugly();
    application();
    here();
} catch (Throwable t) {
    // pretend it's ok
}

але це не є причиною винятків у сучасних мовах програмування.

Ви також можете використовувати whileі breakзамість цього, ifале це не для чого whileі breakдля чого.


Насправді поводження з "ненормальним" потоком управління відбувається саме тоді, коли гото та його перерва на товари є найбільш корисними. Перевага винятків полягає в тому, що вони можуть перетинати межі функцій і те, що абонент може визначити, де це найбільш підходяще, щоб зловити його.
hugomg

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