Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КЛ_Середовище.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
1 Мб
Скачать
☆
      1. Виклик виняткової ситуації

У процедурі C із приклада ми вже могли бачити, як повинна надходити програма при виявленні стану помилки - вона викликає виняткову ситуацію:

raise ESampleError.Create(‘Error!’);

Після ключового слова raise випливає код, аналогічний тому, що використовується для створення нового екземпляра класу. Дійсно, у момент виклику виняткової ситуації створюється екземпляр зазначеного класу; даний екземпляр існує до моменту закінчення обробки виняткової ситуації і потім автоматично знищується. Вся інформація, яку потрібно повідомити в оброблювач помилки передається в об'єкт через його конструктор у момент створення.

Майже всі існуючі класи виняткових ситуацій є спадкоємцями базового класу Exception і не містять нових чи властивостей методів. Клас Exception має трохи конструкторів, який з них конкретно використовувати - залежить від задачі. Опис класу Exception можна знайти в on-line Help.

      1. Доступ до екземпляра об'єкта 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).