Обро́бка ви́нятків (також опрацьо́вування (обробля́ння) винятко́вих ситуа́цій, англ. exception handling) — механізм мов програмування, призначений для обробки помилок часу виконання й інших можливих проблем (винятків), які можуть виникнути під час виконання програми.
Загалом під час виникнення виняткової ситуації, керування передається деякому заздалегідь призначеному обробникові (опрацьовувачу). У деяких мовах, обробник може відновити виконання програми з місця виникнення винятку. Таким чином, обробка помилок передається на вищий рівень і забезпечується можливість так званого нелокального виходу, тобто передачі керування на деяку «віддалену», можливо заздалегідь невідому, точку програми через довільне число викликів функцій.
Переваги та недоліки
Винятки надають основні переваги під час розробки окремих компонентів, коли розробник компонента не знає, як потрібно обробити виняток і залишає написання обробника винятку користувачеві його компонента.
Використання винятків у цілях контролю помилок підвищує прочитність коду, оскільки дозволяє відокремити обробку помилок від самого алгоритму, і полегшує програмування і використання компонентів інших розробників.
Основний недолік винятків — у їхній невисокій швидкості. У місцях програми, критичних за швидкістю, не варто порушувати й обробляти винятки.
У складних програмах виникають великі «нагромадження» операторів try … finally
і try … catch
(try … except
), але без застосування механізму обробки винятків аналогічна за функціональністю програма виглядала б ще більше захаращеною.
Підтримка в різних мовах
Більшість сучасних мов програмування, таких як ActionScript, Ada, , Common Lisp, D, Object Pascal, Eiffel, Java, JavaScript, Objective-C, Objective Caml, Ruby, PHP (з версії 5), Python, SML, , всі мови платформи .NET тощо, мають вбудовану підтримку обробки винятків. У цих мовах, під час виникнення виняткової ситуації (точніше, винятку, підтримуваного мовою), відбувається розкручування стека викликів до першого обробника винятків відповідного типу, і керування передається обробникові.
За винятком незначних відмінностей у синтаксисі, існує лише пара варіантів обробки винятків. У найпоширенішому з них виняткова ситуація генерується спеціальним оператором (throw
або raise
) з об'єктом-винятком. Водночас конструювання такого об'єкта само собою викиду винятку не спричиняє. Область дії обробників починається спеціальним ключовим словом try
або просто мовним маркером початку блоку (наприклад, begin
) і закінчується перед описом обробників (catch
, except
, resque
). Обробників може бути кілька, один за одним, і кожен може вказувати тип винятку, який він обробляє.
Деякі мови також допускають спеціальний блок (else
), який виконується, якщо жодного винятку не згенерувано у відповідній області дії. Частіше зустрічається можливість безумовного виконання коду (finally
, ensure
), навіть у разі, якщо виняток було викинуто, але не оброблено. Помітним винятком є С++, де такої конструкції немає. Замість неї використовується автоматичний виклик деструкторів об'єктів. Водночас існують нестандартні розширення С++, що підтримують і функціональність finally
(наприклад в MFC).
Загалом обробка винятків може виглядати таким чином (у деякій абстрактній мові):
try { line = console.readLine(); if (line.length() == 0) throw new EmptyLineException("Рядок, прочитаний з консолі, пустий!"); console.printLine("Привіт, %s!" % line); } catch (EmptyLineException exception) { console.printLine("Привіт!"); } catch (Exception exception) { console.printLine("Помилка: " + exception.message()); } else { console.printLine("Програма виконана без виняткових ситуацій"); } finally { console.printLine("Програма завершена"); }
У деяких мовах може бути лише один обробник, який розбирається з різними типами винятків самостійно.
У деяких мовах, наприклад Сі або Perl, немає вбудованої обробки винятків.
Винятки, що перевіряються
Спочатку (наприклад, у ), винятки не були обов'язковими для обробки. Якщо якийсь виняток не обробляється, тобто якщо для нього немає обробника в стеку виклику, або обробник викинув виняток наново, то виконання програми уривається.
У новіших мовах, наприклад у Java, разом з «класичними» з'явилися винятки, що перевіряються. Обробка таких винятків перевіряється компілятором. Метод, у якому може виникнути виняток (зокрема й у методах, що викликаються) зобов'язаний або обробити його, або оголосити, що може викинути[] такий виняток.
Переваги та недоліки
Винятки, що перевіряються, знижують кількість ситуацій, коли виняток, який міг бути обробленим, викликав критичну помилку в програмі, оскільки за наявністю обробників стежить компілятор. Це може бути особливо корисно, якщо метод, який не міг викидати виняток типу X став це робити: компілятор автоматично відстежить усі випадки його використання і перевірить наявність відповідного обробника.
Проте, у винятків, що перевіряються, є й недоліки. По-перше, вони часто «примушують» обробляти те, з чим програміст у принципі впоратися не може, наприклад помилку введення-виведення у вебсервері. Це приводить до появи «дурних» обробників, які не роблять нічого або виводять стек виклику винятків і, у результаті, тільки засмічують код. По-друге, це робить неможливим додавання нового винятку, що перевіряється, у методі, описаному в бібліотеці, оскільки це порушує зворотну сумісність. (Це вірно й для небібліотечних методів, але в цьому разі проблема менш істотна).
У результаті, багато бібліотек оголошують усі методи як такі, що викидають деякий суперклас винятків (наприклад, Exception
). У результаті, компілятор «примушує» писати обробники винятків навіть там, де вони, здавалося б, не потрібні.
Примітки
- О. Кочерга, Є. Мейнарович, Англійсько-українсько-англійський словник наукової мови (фізика та споріднені науки). Частина І англійсько-українська 2010р.
Див. також
Ця стаття не містить . (червень 2011) |
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Obro bka vi nyatkiv takozh opraco vuvannya obroblya nnya vinyatko vih situa cij angl exception handling mehanizm mov programuvannya priznachenij dlya obrobki pomilok chasu vikonannya j inshih mozhlivih problem vinyatkiv yaki mozhut viniknuti pid chas vikonannya programi Zagalom pid chas viniknennya vinyatkovoyi situaciyi keruvannya peredayetsya deyakomu zazdalegid priznachenomu obrobnikovi opracovuvachu U deyakih movah obrobnik mozhe vidnoviti vikonannya programi z miscya viniknennya vinyatku Takim chinom obrobka pomilok peredayetsya na vishij riven i zabezpechuyetsya mozhlivist tak zvanogo nelokalnogo vihodu tobto peredachi keruvannya na deyaku viddalenu mozhlivo zazdalegid nevidomu tochku programi cherez dovilne chislo viklikiv funkcij Perevagi ta nedolikiVinyatki nadayut osnovni perevagi pid chas rozrobki okremih komponentiv koli rozrobnik komponenta ne znaye yak potribno obrobiti vinyatok i zalishaye napisannya obrobnika vinyatku koristuvachevi jogo komponenta Vikoristannya vinyatkiv u cilyah kontrolyu pomilok pidvishuye prochitnist kodu oskilki dozvolyaye vidokremiti obrobku pomilok vid samogo algoritmu i polegshuye programuvannya i vikoristannya komponentiv inshih rozrobnikiv Osnovnij nedolik vinyatkiv u yihnij nevisokij shvidkosti U miscyah programi kritichnih za shvidkistyu ne varto porushuvati j obroblyati vinyatki U skladnih programah vinikayut veliki nagromadzhennya operatoriv try finally i try catch try except ale bez zastosuvannya mehanizmu obrobki vinyatkiv analogichna za funkcionalnistyu programa viglyadala b she bilshe zaharashenoyu Pidtrimka v riznih movahBilshist suchasnih mov programuvannya takih yak ActionScript Ada C Common Lisp D Object Pascal Eiffel Java JavaScript Objective C Objective Caml Ruby PHP z versiyi 5 Python SML vsi movi platformi NET tosho mayut vbudovanu pidtrimku obrobki vinyatkiv U cih movah pid chas viniknennya vinyatkovoyi situaciyi tochnishe vinyatku pidtrimuvanogo movoyu vidbuvayetsya rozkruchuvannya steka viklikiv do pershogo obrobnika vinyatkiv vidpovidnogo tipu i keruvannya peredayetsya obrobnikovi Za vinyatkom neznachnih vidminnostej u sintaksisi isnuye lishe para variantiv obrobki vinyatkiv U najposhirenishomu z nih vinyatkova situaciya generuyetsya specialnim operatorom throw abo raise z ob yektom vinyatkom Vodnochas konstruyuvannya takogo ob yekta samo soboyu vikidu vinyatku ne sprichinyaye Oblast diyi obrobnikiv pochinayetsya specialnim klyuchovim slovom try abo prosto movnim markerom pochatku bloku napriklad begin i zakinchuyetsya pered opisom obrobnikiv catch except resque Obrobnikiv mozhe buti kilka odin za odnim i kozhen mozhe vkazuvati tip vinyatku yakij vin obroblyaye Deyaki movi takozh dopuskayut specialnij blok else yakij vikonuyetsya yaksho zhodnogo vinyatku ne zgeneruvano u vidpovidnij oblasti diyi Chastishe zustrichayetsya mozhlivist bezumovnogo vikonannya kodu finally ensure navit u razi yaksho vinyatok bulo vikinuto ale ne obrobleno Pomitnim vinyatkom ye S de takoyi konstrukciyi nemaye Zamist neyi vikoristovuyetsya avtomatichnij viklik destruktoriv ob yektiv Vodnochas isnuyut nestandartni rozshirennya S sho pidtrimuyut i funkcionalnist finally napriklad v MFC Zagalom obrobka vinyatkiv mozhe viglyadati takim chinom u deyakij abstraktnij movi try line console readLine if line length 0 throw new EmptyLineException Ryadok prochitanij z konsoli pustij console printLine Privit s line catch EmptyLineException exception console printLine Privit catch Exception exception console printLine Pomilka exception message else console printLine Programa vikonana bez vinyatkovih situacij finally console printLine Programa zavershena U deyakih movah mozhe buti lishe odin obrobnik yakij rozbirayetsya z riznimi tipami vinyatkiv samostijno U deyakih movah napriklad Si abo Perl nemaye vbudovanoyi obrobki vinyatkiv Vinyatki sho pereviryayutsyaSpochatku napriklad u C vinyatki ne buli obov yazkovimi dlya obrobki Yaksho yakijs vinyatok ne obroblyayetsya tobto yaksho dlya nogo nemaye obrobnika v steku vikliku abo obrobnik vikinuv vinyatok nanovo to vikonannya programi urivayetsya U novishih movah napriklad u Java razom z klasichnimi z yavilisya vinyatki sho pereviryayutsya Obrobka takih vinyatkiv pereviryayetsya kompilyatorom Metod u yakomu mozhe viniknuti vinyatok zokrema j u metodah sho viklikayutsya zobov yazanij abo obrobiti jogo abo ogolositi sho mozhe vikinuti kudi takij vinyatok Perevagi ta nedoliki Vinyatki sho pereviryayutsya znizhuyut kilkist situacij koli vinyatok yakij mig buti obroblenim viklikav kritichnu pomilku v programi oskilki za nayavnistyu obrobnikiv stezhit kompilyator Ce mozhe buti osoblivo korisno yaksho metod yakij ne mig vikidati vinyatok tipu X stav ce robiti kompilyator avtomatichno vidstezhit usi vipadki jogo vikoristannya i perevirit nayavnist vidpovidnogo obrobnika Prote u vinyatkiv sho pereviryayutsya ye j nedoliki Po pershe voni chasto primushuyut obroblyati te z chim programist u principi vporatisya ne mozhe napriklad pomilku vvedennya vivedennya u vebserveri Ce privodit do poyavi durnih obrobnikiv yaki ne roblyat nichogo abo vivodyat stek vikliku vinyatkiv i u rezultati tilki zasmichuyut kod Po druge ce robit nemozhlivim dodavannya novogo vinyatku sho pereviryayetsya u metodi opisanomu v biblioteci oskilki ce porushuye zvorotnu sumisnist Ce virno j dlya nebibliotechnih metodiv ale v comu razi problema mensh istotna U rezultati bagato bibliotek ogoloshuyut usi metodi yak taki sho vikidayut deyakij superklas vinyatkiv napriklad Exception U rezultati kompilyator primushuye pisati obrobniki vinyatkiv navit tam de voni zdavalosya b ne potribni PrimitkiO Kocherga Ye Mejnarovich Anglijsko ukrayinsko anglijskij slovnik naukovoyi movi fizika ta sporidneni nauki Chastina I anglijsko ukrayinska 2010r Div takozhNeviznachena povedinka Bezpeka vinyatkovih situacij Cya stattya ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno cherven 2011 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi