- •Курс лекцій
- •Київ-Черкаси 20010
- •1 Об‘єктно-орієнтоване програмування
- •1.1. Складові класу
- •1. Поля
- •2. Методи
- •3. Властивості
- •1.2 Оголошення класу
- •2.1 Стандартні компоненти
- •2 Огляд палітри компонентів
- •2.2 Сторінки Additional та System
- •3 Обробка виняткових ситуацій у delphi
- •Структурна обробка виняткових ситуацій
- •Модель виняткових ситуацій у Delphi
- •Синтаксис обробки виняткових ситуацій
- •Приклади обробки виняткових ситуацій
- •Виклик виняткової ситуації
- •Доступ до екземпляра об'єкта exception
- •3.4 Визначені оброблювачі виняткових ситуацій
- •3.4.1 Виключення, що виникають при роботі з базами даних
- •4 Графічні можливості delphi
- •Олівець і кисть
- •Олівець
- •Лістинг 4.1 Стилі заповнення областей
- •Вивід тексту
- •Методи креслення графічних примітивів
- •Лістинг 4.2 Осі координат і оцифрована сітка
- •Ламана лінія
- •Лістинг 4.3 Графік функції (використання методу Polyline)
- •Лістинг 4.4 Креслення замкнутого контуру (зірки) у точці натискання кнопки миші
- •Окружність і еліпс
- •Прямокутник
- •Багатокутник
- •Лістинг 4.5. Графік функції
- •Вивід ілюстрацій
- •Лістинг 10.6 Слайд-проектор
- •Бітові образи
- •Лістинг 4.7. Використання бітових образів
- •5 Робота з базами данних в delphi
- •Властивість sql
Виклик виняткової ситуації
У процедурі C із приклада ми вже могли бачити, як повинна надходити програма при виявленні стану помилки - вона викликає виняткову ситуацію:
raise ESampleError.Create(‘Error!’);
Після ключового слова raise випливає код, аналогічний тому, що використовується для створення нового екземпляра класу. Дійсно, у момент виклику виняткової ситуації створюється екземпляр зазначеного класу; даний екземпляр існує до моменту закінчення обробки виняткової ситуації і потім автоматично знищується. Вся інформація, яку потрібно повідомити в оброблювач помилки передається в об'єкт через його конструктор у момент створення.
Майже всі існуючі класи виняткових ситуацій є спадкоємцями базового класу Exception і не містять нових чи властивостей методів. Клас Exception має трохи конструкторів, який з них конкретно використовувати - залежить від задачі. Опис класу Exception можна знайти в on-line Help.
Доступ до екземпляра об'єкта exception
Дотепер ми розглядали механізми захисту коду і ресурсів, логіку роботи програми у винятковій ситуації. Тепер потрібно небагато розібратися з тим, як же обробляти виниклу помилку. А точніше, як одержати додаткову інформацію про код помилки, текст повідомлення і т.п.
Як уже говорилося, при виклику виняткової ситуації (raise) автоматично створюється екземпляр відповідного класу, що і містить інформацію про помилку. Усе питання в тім, як в оброблювачі даної ситуації одержати доступ до цього об'єкта.
Розглянемо модифіковану процедуру A у нашому прикладі:
procedure NewA;
begin
writeln('Enter A');
try
writeln('Enter A''s try block');
B;
writeln('After B call');
except
on E: ESampleError do writeln(E.Message);
on ESomethingElse do
writeln('Inside A''s ESomethingElse handler');
end;
writeln('Exit A');
end;
Тут усі зміни внесені в рядок
on ESE: ESampleError do writeln(ESE.Message);
Приклад демонструє ще одне нововведення в мові Object Pascal - створення локальної перемінної. У нашому прикладі локальної перемінної є ESE - це той самий екземпляр класу ESampleError, що був створений у процедурі C у момент виклику виняткового стану. Перемінна ESE доступна тільки усередині блоку do. Властивість Message об'єкта ESE містить повідомлення, що було передано в конструктор Create у процедурі C.
Є ще один спосіб доступу до екземпляра exception - використовувати функцію ExceptionObject:
on ESampleError do
writeln(ESampleError(ExceptionObject).Message);
3.4 Визначені оброблювачі виняткових ситуацій
Нижче Ви знайдете довідкову інформацію з визначеним виключенням, необхідну для професійного програмування в Delphi.
Exception - базовий клас-предок всіх оброблювачів виняткових ситуацій.
EAbort - “сховане” виключення. Використовуйте його тоді, коли хочете перервати той чи інший процес з умовою, що користувач програми не повинний бачити повідомлення про помилку. Для підвищення зручності використання в модулі SysUtils передбачена процедура Abort, визначена, як:
procedure Abort;
begin
raise EAbort.CreateRes(SOperationAborted) at ReturnAddr;
end;
EComponentError - викликається в двох ситуаціях:
1) при спробі реєстрації компоненти за межами процедури Register;
2) коли ім'я компонента не унікально чи не припустимо.
EConvertError - відбувається у випадку виникнення помилки при виконанні функцій StrToInt і StrToFloat, коли конвертація рядка у відповідний числовий тип неможлива.
EInOutError - відбувається при помилках уведення/виведення при включеній директиві {$I+}.
EIntError - предок виключень, що случаються при виконанні цілочисельних операцій.
EDivByZero - викликається у випадку розподілу на нуль, як результат RunTime Error 200.
EIntOverflow - викликається при спробі виконання операцій, що приводять до переповнення цілих перемінних, як результат RunTime Error 215 при включеній директиві {$Q+}.
ERangeError - викликається при спробі звертання до елементів масиву по індексі, що виходить за межі масиву, як результат RunTime Error 201 при включеній директиві {$R+}.
EInvalidCast - відбувається при спробі приведення перемінних одного класу до іншого класу, несумісному з першим (наприклад, приведення перемінної типу TListBox до TMemo).
EInvalidGraphic - викликається при спробі передачі в LoadFromFile файлу, несумісного графічного формату.
EInvalidGraphicOperation - викликається при спробі виконання операцій, непридатних для даного графічного формату (наприклад, Resize для TIcon).
EInvalidObject - реально ніде не використовується, оголошений у Controls.pas.
EInvalidOperation - викликається при спробі чи відображення звертання по Windows-оброблювачі (handle) контрольного елемента, що не має власника (наприклад, відразу після виклику MyControl:=TListBox.Create(...) відбувається звертання до методу Refresh).
EInvalidPointer - відбувається при спробі звільнення вже звільненого чи ще неиніційованого покажчика, при виклику Dispose(), FreeMem() чи деструктора класу.
EListError - викликається при звертанні до елемента спадкоємця TList по індексу, що виходить за межі припустимих значень (наприклад, об'єкт TStringList містить тільки 10 рядків, а відбувається звертання до одинадцятого).
EMathError - предок виключень, що случаються при виконанні операцій із крапкою, що плаває.
EInvalidOp - відбувається, коли математичному співпроцесору передається помилкова інструкція. Таке виключення не буде до кінця оброблено, поки Ви контролюєте співпроцесор прямо з ассемблерного коду.
EOverflow - відбувається як результат переповнення операцій із крапкою, що плаває, при занадто великих величинах. Відповідає RunTime Error 205.
Underflow - відбувається як результат переповнення операцій із крапкою, що плаває, при занадто малих величинах. Відповідає RunTime Error 206.
EZeroDivide - викликається в результаті розподілу на нуль.
EMenuError - викликається у випадку будь-яких помилок при роботі з пунктами меню для компонентів TMenu, TMenuItem, TPopupMenu і їхніх спадкоємців.
EOutlineError - викликається у випадку будь-яких помилок при роботі з TOutLine і будь-якими його спадкоємцями.
EOutOfMemory - відбувається у випадку викликів New(), GetMem() чи конструкторів класів при неможливості розподілу пам'яті. Відповідає RunTime Error 203.
EOutOfResources - відбувається в тому випадку, коли неможливе виконання запиту на чи виділення заповнення тих чи інших Windows ресурсів (наприклад таких, як оброблювачі - handles).
EParserError - викликається коли Delphi не може зробити розбір і переклад тексту опису форми в двійковий вид (часто відбувається у випадку виправлення тексту опису форми вручну в IDE Delphi).
EPrinter - викликається у випадку будь-яких помилок при роботі з принтером.
EProcessorException - предок виключень, викликуваних у випадку переривання процесора- hardware breakpoint. Ніколи не включається в DLL, може оброблятися тільки в “цільному” додатку.
EBreakpoint - викликається у випадку останова на крапці переривання при налагодженні в IDE Delphi. Середовище Delphi обробляє це виключення самостійно.
EFault - предок виключень, викликуваних у випадку неможливості обробки процесором тих чи інших операцій.
EGPFault - викликається, коли відбувається “загальне порушення захисту” - General Protection Fault. Відповідає RunTime Error 216.
EInvalidOpCode - викликається, коли процесор намагається виконати неприпустимі інструкції.
EPageFault - звичайно відбувається як результат помилки менеджера пам'яті Windows, унаслідок деяких помилок у коді Вашого додатка. Після такого виключення рекомендується запустити знову Windows.
EStackFault - відбувається при помилках роботи зі стеком, часто внаслідок некоректних спроб доступу до стеку з фрагментів коду на ассемблері. Компіляція Ваших програм із включеною перевіркою роботи зі стеком {$S+} допомагає відстежити такого роду помилки.
ESingleStep - аналогічно EBreakpoint, це виключення відбувається при покроковому виконанні додатка в IDE Delphi, що сама його й обробляє.
EPropertyError - викликається у випадку помилок у редакторах властивостей, що вбудовуються в IDE Delphi. Має велике значення для написання надійних property editors. Визначений у модулі DsgnIntf.pas.
EResNotFound - відбувається у випадку тих чи інших проблем, що мають місце при спробі завантаження ресурсів форм - файлів .DFM у режимі дизайнера. Часто причиною таких виключень буває порушення відповідності між визначенням класу форми і її описом на рівні ресурсу (наприклад,унаслідок зміни порядку проходження заслань-полів-посилань на компоненти, вставлені у форму в режимі дизайнера).
EStreamError - предок виключень, викликуваних при роботі з потоками.
EFCreateError - відбувається у випадку помилок створення потоку (наприклад, при некоректному завданні файлу потоку).
EFilerError - викликається при спробі вторинної реєстрації вже зареєстрованого класу (компоненти). Є, також, предком спеціалізованих оброблювачів виключень, що виникають при роботі з класами компонентів.
EClassNotFound - звичайно відбувається, коли в описі класу форми вилучене заслання-стать-посилання на компонент, вставлений у форму в режимі дизайнера. Викликається, на відміну від EResNotFound, у RunTime.
EInvalidImage - викликається при спробі читання файлу, що не є ресурсом, чи зруйнованого файлу ресурсу, спеціалізованими функціями читання ресурсів (наприклад, функцією ReadComponent).
EMethodNotFound - аналогічно EClassNotFound, тільки при невідповідності методів, зв'язаних з тими чи іншими оброблювачами подій.
EReadError - відбувається в тому випадку, коли неможливо прочитати значення чи властивості іншого набору байт із потоку (у тому числі ресурсу).
EFOpenError - викликається коли той чи інший специфікований потік не може бути відкритий (наприклад, коли потік не існує).
EStringListError - відбувається при помилках роботи з об'єктом TStringList (крім помилок, оброблюваних TListError).
