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

4. Виняткова ситуація eAbort. Функція Assert.

Якщо ви уважно проглянули код системної процедури HandieException, то побачили там згадку класу EAbort. ВС EAbort служить єдиним – і дуже важливим – виключенням з правил обробки. Вона називається "тихою" (Silent) і відрізняється тим, що для неї обробка за умовчанням не передбачає висновку повідомлень на екран. Природно, все сказане торкається і породжених від неї дочірніх об'єктних класів.

Застосування EAbort виправдано у багатьох випадках. Ось один з прикладів. Хай розробляється деяка прикладна програма або деяке сімейство об'єктів, не пов'язане з VCL. Якщо в них виникає ВС, то потрібно якось сповістити про це користувача. А тим часом прямий виклик для цього функції showMessage або навіть MessageBox не завжди виправданий. Для маленької і компактної динамічної бібліотеки не потрібно тягнути за собою громаду VCL. З другого боку, у великому і різнорідному проекті не можна давати кожному об'єкту або підпрограмі самій спілкуватися з користувачем. Якщо їх розробляють різні люди, такий проект може перетворитися на вавілонську башту. Тут і допоможе EAbort. Ця виняткова ситуація не створюється системою – її повинен створювати і обслуговувати програміст.

Застосування EAbort – реальна альтернатива численним конструкціям if..then і тим більш (спаси боже!) goto. Ця ВС не повинна підміняти собою інші, ніби помилки виділення пам'яті або читання з файла. Вона потрібна, якщо ви самі бачите, що склалися певні умови і пора міняти логіку роботи програми.

If LogicalCondition then Raise EAbort.Create('Condition 1');

Якщо не потрібно визначати повідомлення, можна створити EAbort і простіше - викликавши процедуру Abort (без параметрів), що міститься в модулі SYSUTILS.PAS.

Функція Assert.

Ця процедура і супутня їй ВС EAssertionFailed спеціально перенесені в Object Pascal з мови для зручності відладки. Синтаксис її простий:

procedure Assert(expr : Boolean [; const msg: string]);

При виклику функції перевіряється, чому рівно значення переданого в неї булевого виразу ехрr. Якщо воно рівне True, то зовсім нічого не стається. Якщо ж воно рівне False, створюється ВС EAssertionFailed. Все це було б досить тривіально з погляду вже вивченого, коли б не дві обставини:

1. Приречений обробник EAssertior.Failed влаштований таким чином, що видає не шістнадцяткову адресу помилки, а ім'я файла з початковим текстом і номер рядка, де відбулася ВС, як показано на мал.

Вікно повідомлення обробника виняткової ситуації EAssertionFailed

2. За допомогою спеціальної директиви компілятора {$ASSERTIONS ON/OFF} (або, що те ж саме {$с+}/{$с-}) виникнення цих ВС можна централізований заборонити. Тобто у відладжуваному коді в режимі {$с+} можна розставити виклик Assert у всіх сумнівних і перевіряються місцях. Коли ж прийде час генерації кінцевого варіанту коду, перемиканням директиви на {$с-} весь налагоджувальний висновок забороняється.

В Delphi для обробки виняткових ситуацій використовуються спеціальні конструкції мови Object Pascal і класи на основі базового класу виняткових ситуацій Exception.

Питання для самоконтролю:

  1. За яким алгоритмом обробляється виняткова с итуція ?

  2. Як здійснюється протоколювання виняткових ситуацій?

  3. Зі скількох етапів здійснюється поміщення текту у файл ресурсів?

  4. Для чого призначена виняткова ситуація EAbort?

  5. Яке призначення функції Assert?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]