Винятки в delphi, класи виключень

Винятки (exceptions) - це спосіб передачі інформації про помилку часу виконання або про інших виняткових ситуаціях з того місця, яке першим її виявило, в код, передбачений для обробки таких ситуацій. В кінцевому підсумку помилки обумовлені неповною опрацюванням всіх варіантів роботи програми. У наступних версіях програми виявлені помилки можна спробувати усунути, проте багато що можна передбачити і відразу.

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

Модель виняткових ситуацій в Object Pascal є невідновлювальної (non-resumable). При виникненні виняткової ситуації ви вже не зможете повернутися в точку, де вона виникла, для продовження виконання програми (це дозволяє зробити відновлювальна (resumable) модель). Невідновлювані виняткові ситуації руйнують стек, оскільки вони сканують його в пошуках обробника; в відновлюваної моделі необхідно зберігати стек, стан регістрів процесора в точці виникнення помилки і виконувати пошук обробника і його виконання в окремому стеку. Поновлювану систему обробки виняткових ситуацій набагато важче створити і застосовувати, ніж непоновлювану.

У Delphi виняткові ситуації з'являються в формі об'єктів. Вони збуджуються і існують до тих пір, поки винятку не буде оброблено.

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

класи винятків

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

Всі класи виключення прийнято називати на літеру «Е». Списки стандартних винятків, оголошених в Delphi, можна знайти в літературі.

Клас Exception визначено в модулі SysUtils приблизно наступним чином. Базовий клас включає поле FMessage строкового типу, оголошене в розділі Private. Воно є за допомогою властивості Message, що має прямий доступ до поля при читанні і запису його значення. Саме цей рядок виводиться при обробці виняткової ситуації за замовчуванням.

Constructor Create (Const Msg: String);
Constructor CreateFmt (Const Msg: String; Const Args: Array Of Const); (Форматований повідомлення)
Для використання ресурсів:
Constructor CreateRes (Ident: Integer); Overload;
Constructor CreateRes (ResStringRec: PResStringRec); Overload;

Є ще конструктори для використання довідкової системи
Конструктор Create приймає один параметр Msg типу String. Цей рядок повинна бути інформативною або осмисленої рядком, що представляє виняток, або клас винятків. І ще багато конструкторів.

Виняткові ситуації в базах даних

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

EDatabaseError = Class (Exception); // Клас визначено в модулі DB
EDBEngineError = Class (EDatabaseError) // Визначено в модулі DBTables

Якщо велика частина класів виняткових ситуацій Delphi просто видає повідомлення про помилку, то виняткові ситуації баз даних створені так, що дозволяють надати список можливих помилок, включаючи як коди помилок локальних баз даних, так і SQL-серверів. Для цього у класу EDBEngineError є два додаткових властивості: ErrorCount (кількість помилок) і Errors (список всіх помилок). Кожен елемент властивості Errors є об'єктом класу TDBError, оголошеного в модулі DB і має п'ять властивостей для читання (Ro), які повертають докладні відомості про помилку.
Залежно від коду помилки можна передбачити різні варіанти реакції на них. Коди всіх помилок BDE наведені в файлі BDE.INT.

тихі виключення

В архітектурі обробки виняткових ситуацій Delphi є ще один засіб обробки виключень. Це будь-який екземпляр виняткової ситуації, ініційований з класу EAbort або його нащадків. Фірма Borland називає ці винятки «тихими» (silent) або «прихованими». Справа в тому, що обробка таких винятків не піднімається вище одного рівня і не передбачається виведення ніяких повідомлень. Фактично швидко знищуються виключення. Така обробка не створюється сама собою: її необхідно в потрібних випадках передбачати і обробляти програмісту.

апаратні виключення

Слід зазначити, що крім винятків Delphi існують апаратні виключення, пов'язані з роботою апаратного забезпечення і апаратними перериваннями. До них можна віднести помилки, що виникають при роботі принтера, дисковода і т.п. Є певна можливість включити апаратні виключення в виключення Delphi і таким чином обробляти подібні ситуації. Проте, апаратні виключення відрізняються від винятків Delphi.