Винятки 7 виключення виключення і їх стандартна обробка
При роботі програми можуть виникати різного роду помилки: переповнення, розподіл на нуль, спроба відкрити неіснуючий файл і т.п. При виникненні таких виняткових ситуацій програма генерує так зване виключення і виконання подальших обчислень а даному блоці припиняється.
Виняток - це об'єкт спеціального виду, що характеризує виникла в програмі виняткову ситуацію. Він може також містити в вигляді параметрів деяку уточнюючу інформацію. Особливістю винятків є те, що це суто тимчасові об'єкти. Як тільки вони оброблені якимось обробником, вони руйнуються.
Якщо винятку не перехоплено ніде в програмі то воно обробляється методом TApplicatiun.HandleExctiption. Він забезпечує стандартну реакцію програми на більшість винятків - видачу користувачеві короткої інформації в вікні повідомлень і знищення примірника виключення. Ви, напевно, стикалися з такими стандартними повідомленнями, як: целочисленное ділення на нуль, спроба відкрити неіснуючий файл або спроба перетворити функцією StrToInt рядок "1.5" в ціле число.
Якщо хочете, то можете відключити появу цих повідомлень. Для цього треба виконати команду Tools | Debugger Options, в діалоговому вікні вибрати сторінку Language Exceptions і на ній вимкнути опцію Stop On Delphi Exceptions. Якщо не вжити відповідних заходів, то при генерації виключень до неприємностей припинення обчислень можуть додатися ще неприємності, пов'язані з так званої у течкой ресурсів. Під цим маються на увазі втрати динамічно розподіляє пам'яті, незакриті файли, не знищені тимчасові файли на диску та інший "сміття". Наприклад, нехай ви виконуєте деяку програму, в якій є такі оператори:
Ви відкриваєте тимчасовий файл з ім'ям a.tmp, щоб зберігати в ньому якісь проміжні дані обчислень. В кінці роботи ви маєте намір знищити його процедурою Erase. Ви динамічно виділяєте деяку пам'ять процедурою New, маючи намір звільнити її, коли вона вам більше не буде потрібна, процедурою Dispose. Але якщо в проміжних операторах, позначених вище точками, виникне виключення, то обчислення урвуться і процедури Erase і Dispose не будуть виконані. В результаті пам'ять, виділена процедурою New, залишиться недоступною, а на диску збережеться тимчасовий і вже непотрібний файлa.tmp.
Крім зазначеного, стандартна обробка винятків програмою має ще один недолік - користувач залишається в повному невіданні, що ж йому далі робити? І не тільки не дуже кваліфікований користувач, якого повідомлення на англійській мові можуть шокувати. Навіть досвідченому людині неможливо часом здогадатися, що ж у вашій програмі ділиться на нуль і як цього можна уникнути. Напевно, кожен потрапляв в подібні ситуації, навіть застосовуючи професійно зроблені програми, включаючи Windows.