Лекція №9 (4 год.)
ТЕМА: Класи загального призначення.
Клас Exception.
Виклик винятків.
Створення власного класу.
Клас Tfont.
Клас Tpen.
Клас Tbrush.
Клас TCanvas.
Області.
I.Клас Exception – обробіток винятків.
Клас Exception являється прямим потомком базового класу TObject. Разом зі своїми нащадками він призначений для обробітку виняткових ситуацій(винятків), що виникають при некоректних діях програми.
При роботі в середовищі Delphi експеременти з винятками погано прослідковуються, так як при кожному винятку середовище перехоплює керування програмою. В даному випадку буває корисним відключення даної опції середовища: Tools/Environment Options/ Preference флажок Break on exception.
Для обробітку винятків в Об’єктному паскалі є механізм захищеного блоку:
Try <оператори> except <обробка винятків> else <оператори> end; |
Try <оператори> finally <оператори> end; |
Захищений блок починається зарезервованим словом try (попробувати [виконати]) і закінчується словом end. Існує два типи захищених блоків except (виключити) і finally ( в завершення), що відрізняються способом обробки винятків.
В блоці except порядок виконання операторів такий: спочатку виконуються оператори секції try...except; якщо оператори виконуються без винекнення виняткових ситуацій, робота захищеного блоку завершується, і керування отримує оператор що йде за словом end; якщо при виконані частини try виник виняток, керування отримує відповідний обробник в секції except, а якщо такий там не знайдений – то перший оператор, що стоїть за словом else.
В блоці finally оператори в секції finally...end отримують керування завжди, незалежно від того, виник винято чи ні в секції try...finaly чи ні. Якщо виняток виник, всі оператори в секції try...finaly, що стоять за оператором в якому виник виняток пропускаються, і керування отримує перший оператор секції finally..end. Якщо винятку не було, цей оператор отримає керування після виконання останнього оператора секції try...finally.
Обробники винятків в блоці except мають такий синтаксис: on <клас винятку> do <оператор>;
Тут on, do – зарезервовані слова; <клас винятку> - клас обробки винятків; <оператор> - будь-який оператор ОП, крім оператора передачі керування goto на мітку по-за блоку except. Оператор що стоїть за словом do може бути складовим.
Пошук потрібного обробника здійснюється з початку списку вниз до тих пір поки не зустріниця клас, здатний обробити виняток даного типу. Якщо потрібного класу не знайдено, керування передається опрераторам, що стоять за словом else, а якщо даного виразу немає (частина else <оператори> може упускатися), виконується замовчувана обробка винятків.
Якщо для програміста важливий тільки сам факт виникнення помилки, і неважливий тип зв’язаний з даною помилкою, він може упустити в секції except..end обробники разом зі словом else, залишивши лише необхідний код реакції на будь яку помилку.
Захищені блоки можуть вложуватися один в один на необмежену глибину.
Клас Exception.
Клас Exception являєть батьківським класом для всіх класів винятків. Цей клас оголошений в модулі SysUtils.
В класі оголошено два поля:
Fmessage: string;
FhelpContext:Integer;
І визначено 8 конструкторів для створення об’єкта. За їх допомогою можна прочитати тексове повідомлення із ресурса, відформатувати його, зв’язати виняток з контекстом довідкової служби.
Також клас використовує дві властивості за допомогою яких здійснюється доступ до полів класу це
HelpContext i Message.
В Delphi визначені стандартні класи винятків, які можуть використовуватись в обробнику винятків.
Важливо пам’ятати, що шукається самий перший із можливих декількох обробників винятків.
При винекнені виняткової ситуації об’єкти класів обробників створюються і знищуються автоматично. Якщо програміст забажає використати поля або методи класу-обробника явно, він повинен назвати автоматично створений об’єкт. Для цього перед іменем класу ставиться ідентифікатор і двікрапки:
On er:EdivByZero do er.----;
-EdivByZero – клас пов’язаний з помилкою при цілочисленому ділені на 0.
Для стандартних класів це дозволить використати властивість Message з стандартним повідомленням про помилку.
Винятком є лише клас EinOutError, в якому є цілочислена властивість ErrorCode з кодом помилки введення/виведення.
Для виведення повідомлень можливо використати такий спосіб:
ShowMessage(s:string);
ІІ.Виклик винятків.
В деяких ситуаціях програмісту потрібно ініціювати власний виняток. Для цього використовується зарезервоване слово raise. Якщо це слово зустрінеться в секції try...exception або try...finally, негайно починають свою роботу відповідно except...end i finally...end, рахується що даний захищений блок на поточному рівні вложеності завершив свою роботу і керування передається вищестоячому рівню.
Слово raise викликає виняток самого загального класу Exception. Якшо програміст бажає викликати виняток конкретного типу (не важно стандартного або власного), він повинен явно вказати клас створюваного в цей момент об’єкту шляхом виклику його конструктора. Наприклад наступний оператор викличе помилку введення виведення:
Raise EinOutError.Create(‘Помилка!’)
ІІІ.Створення власного класу.
Програміст може створити власний клас обробки винятків, оголосивши його нащадком Exception або будь-якого стандартного класу (цим будь-яким класом найчастіше буває клас Eabort).
Приклад:
Type
EkError = class(Eabort)
End;
Тепер можна використати його:
Try
..........
reise EkError.Create(‘Повідомлення’);
..........
except
on e:EkError do ShowMessage(E.Message);
..........
end;