Обробка винятків: відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
ArthurBot (обговорення | внесок)
м робот додав: simple:Error Handling
правопис, оформлення
Рядок 1:
'''Обро́бка ви́нятків''' ({{lang-en|exception handling}})  — механізм [[Мова програмування|мов програмування]], призначений для обробки помилок часу виконання і інших можливих проблем (винятків), які можуть виникнути при виконанні програми.
 
В цілому, при виникненні виняткової ситуації, управління передається деякому заздалегідь призначеному обробникові. У деяких мовах, обробник може відновити виконання програми з місця виникнення винятку. Таким чином, обробка помилок передається на вищий рівень і забезпечується можливість так званого нелокального виходу, тобто передачі управління на деяку «віддалену», можливо заздалегідь невідому, точку програми через довільне число викликів функцій.
Рядок 8:
Використання винятків в цілях контролю помилок підвищує читаність коду, оскільки дозволяє відокремити обробку помилок від самого алгоритму, і полегшує програмування і використання компонентів інших розробників.
 
Основний недолік винятків  — в їхній невисокій швидкості. У місцях програми, критичних за швидкістю, не варто порушувати і обробляти винятки.
 
В складних програмах виникають великі «нагромадження» операторів try ... finally і try ... catch (try ... except), але без застосування механізму обробки винятків аналогічна за функціональністю програма виглядала б ще більше захаращеною.
 
== Підтримка в різних мовах ==
Більшість сучасних мов програмування, таких як [[ActionScript]], [[Ada]], [[C++]], [[Common Lisp]], [[D (мова програмування)|D]], [[Delphi (мова програмування)|Delphi]], [[Eiffel]], [[Java]], [[JavaScript]], [[OBJECTIVE-C]], [[OCaml]], [[Ruby]], [[PHP]] (з версії 5), [[Python]], [[SML]], [[Глагол (мова програмування)|Глагол]], всі мови платформи [[.NET]] тощо, мають вбудовану підтримку обробки винятків. У цих мовах, при виникненні виняткової ситуації (точніше, винятку, підтримуваного мовою), відбувається розкручування стека викликів до першого обробника винятків відповідного типу, і управління передається обробникові.
 
За винятком незначних відмінностей в синтаксисі, існує лише пара варіантів обробки винятків. У найбільш поширеномунайпоширенішому з них виняткова ситуація генерується спеціальним оператором (throw або raise) з об'єктом-винятком. При цьому, конструювання такого об'єктуєкта само по собі викиду винятку не зпричиняєспричиняє. Область дії обробників починається спеціальним ключовим словом '''try''' або просто мовним маркером початку блоку (наприклад, '''begin''') і закінчується перед описом обробників ('''catch''', '''except''', '''resque'''). Обробників може бути кілька, один за одним, і кожен може вказувати тип винятку, який він обробляє.
 
Деякі мови також допускають спеціальний блок ('''else'''), який виконується, якщо жодного винятку не згенерувано у відповідній області дії. Частіше зустрічається можливість безумовного виконання коду ('''finally''', '''ensure'''), навіть у випадку якщо виняток було викинуто, але не оброблено. Помітним виключенням є Сі++, де такої конструкції немає. Замість неї використовується автоматичний виклик деструкторів об'єктів. Разом з тим існують нестандартні розширення Сі++, що підтримують і функціональність '''finally''' (наприклад в [[MFC]]).
Рядок 55:
Проте, у винятків, що перевіряються, є і недоліки. По-перше, вони часто «примушують» обробляти те, з чим програміст в принципі справитися не може, наприклад помилку введення-виведення у [[веб-сервер]]і. Це приводить до появи «дурних» обробників, які не роблять нічого або виводять стек виклику винятків і, у результаті, тільки засмічують код. По-друге це робить неможливим додавання нового винятку, що перевіряється, в методі, описаному в [[бібліотека (програмування)|бібліотеці]], оскільки це порушує зворотну сумісність. (Це вірно і для небібліотечних методів, але в цьому випадку проблема менш істотна).
 
У результаті, багато бібліотек оголошують всі методи як такі, що викидають деякий суперклас винятків (наприклад, Exception). ВУ результаті, компілятор «примушує» писати обробники винятків навіть там, де вони, здавалося б, не потрібні.
 
[[Категорія:Програмування]]