Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка 5 Справка в VFP Обработка ошибок Отла...doc
Скачиваний:
1
Добавлен:
20.08.2019
Размер:
2.18 Mб
Скачать

2.8.Методика перехоплення помилок

Якщо помилка з'являється під час виконання програми, Visual FoxPro виводить на екран вікно системного повідомлення про помилку. Нижче тексту повідомлення розташовані чотири кнопки — Cancel (Скасування), Suspend (Призупинити), Ignore (Ігнорувати) і Help (Довідка). У більшості випадків не має змісту ігнорувати помилку. Якщо програма написана для користувачів, їм ніколи не рекомендується цього робити. Фактично для них навіть інформація в цьому вікні не принесе ніякої користі. Замість виводу такого вікна потрібно постаратися програмними засобами перехоплювати в додатку всі помилки й обробляти їх відповідними методами. Зокрема, можна фіксувати стан системи в момент виникнення помилки в якому-небудь файлі протоколу і коректно завершувати виконання програми11.

Однак тут, як і в будь-якім правилі, теж існують виключення. Якщо програма припиняє виконання через те, що не може знайти якийсь файл зображення на диску, то цю помилку, можливо, і варто проігнорувати. Але подібні ситуації вкрай рідкі. Практично завжди програма не може нормально функціонувати далі, якщо не одержує доступу до якогось файлу.

Для розроблювача опція Suspend досить приваблива під час тестування. При її виборі виконання програми припиняється, але поточні перемінні в пам'яті зберігаються. Усі відкриті в цей момент таблиці залишаються відкритими зі збереженням стану покажчиків записів. Дуже важливо, що після такої зупинки можна відкрити вікно Trace налагоджувальника. У цьому вікні відображається програмний код виконуваного фрагмента, причому поточний оператор виділений кольором. У розроблювача також мається можливість переглянути значення перемінних і деталі процесу виконання (наприклад, стан стека викликів) і продовжити виконання програми в покроковому режимі.

Visual FoxPro має кілька убудованих функцій, що покликані полегшити обробку помилок. Для їхнього використання насамперед потрібно відключити механізм обробки помилок, задіяний у Visual FoxPro за замовчуванням. Замість того щоб виводити на екран системне вікно повідомлення про помилку, потрібно передати керування спеціальному оброблювачу помилок. Нижче наведена проста підпрограма обробки помилок. Вона організує вивід трохи більше інформації про помилку, чим у системному вікні. Для цього використовується багатострочне вікно команди WAІT WІNDOW. Подібний прийом можна використовувати для формування протоколу помилок, їх аналіз та перехват. Зібравши подібну інформацію після декількох запусків програми з різними вхідними даними чи при різних настроюваннях середовища, можна судити про частоту появи помилки, впливі різних настроювань і т. п. Згодом так можна буде знайти “першоджерело” помилкової ситуації.

ON ERROR DO ErrLog WITH;

ERROR(), MESSAGE(), MESSAGE(1), LINENO(l), PROGRAM()

** Інші оператори додатка **

PROCEDURE ErrLog

LPARAMETER InErrorNo, IcMessage, IcErrorLine, IcErrLineNo, IcModule

WAIT WINDOW;

'Помилка виникла в:' + IcModule + CHR(13) +;

'ERROR: ' + STR(InErrorNo, 6) + ' ' + IcMessage + CHR(13) +;

'В операторі: ' + STR(IcErrLineNo, 6) + ' ' + IcErrorLine

RETURN

Функція ERROR() повертає системний номер помилки. У додатку до документа Developer's Guide перераховані всі номери помилок, що розпізнаються виконавчою системою Visual FoxPro, причому кожна помилка супроводжується коротким описом. Аналогічну інформацію можна знайти й у розділі Error Messages оперативної довідки Visual FoxPro.

Велику користь може принести функція MESSAGE(). Якщо при її виклику не передавати ніяких параметрів, функція повертає текст короткого опису помилки (правда, англійською мовою). Це той же самий опис, що виводиться й у системному вікні повідомлення. Якщо ж при виклику MESSAGE() передати параметр 1, функція поверне рядок програмного коду, що і створив аварійну ситуацію.

Функція LІNENO() повертає номер рядка програмного коду, що призупинила виконання програми. За замовчуванням номер відраховується від першого рядка головної програми додатка. Оскільки в додатку, як правило, викликаються численні функції і процедури, що розміщаються в окремих файлах, відлік від головної програми мало інформативний. При передачі в LІNENO() параметра 1 функція повертає номер рядка від початку поточної функції чи процедури. Цей номер уже більше підходить для переходу за допомогою команди EditÞGo to Line до потрібного рядка коду у вікні редактора. Редактор, що підключається до Visual FoxPro за замовчуванням, може виводити і номера рядків у файлі ліворуч від тексту, якщо його відповідно настроїти. Настроювання виконується в діалоговому вікні Edit Properties, що виводиться на екран командою Edіt1ÞProperties. У цьому вікні необхідно установити прапорець Show Line/Column Posіtіon (Показувати рядок/колонку). Якщо бажано бачити номер рядка коду у вікні Trace, виберіть команду ToolsÞOptions, відкрийте вкладку Debug і клацніть на кнопці опції Trace.

Функція PROGRAM() повертає ім'я виконуваної програми (модуля), якщо вона викликана з параметром 0, і ім'я головної програми, якщо параметр дорівнює 1. За допомогою цієї функції можна одержати й інформацію про інші підпрограми в стеці викликів, використовуючи зростаючі значення параметра доти, поки функція не стане повертати порожній рядок. Visual FoxPro підтримує до 128 рівнів вкладеності викликів. Функція PROGRAM() багато в чому нагадує SYS(16), але остання повертає не тільки ім'я підпрограми, але і шлях до відповідного файлу. При виникненні помилки SYS(16) виводить повідомлення, що починається з імені поточної підпрограми (процедури чи функції), потім шлях до файлу, у якому зберігається її програмний код, і далі — ім'я програми що визвала.

Другий параметр при виклику функції SYS(16, nLevel) настроює її на вивід імені програми на відповідному рівні вкладеності викликів. Якщо nLevel = 0, буде повернуте ім'я поточної підпрограми, що виконується. Значення 1 відповідає рівню головної програми додатка, а далі при зростанні значення nLevel перебираються імена підпрограм у стеці викликів аж до поточною, що стала причиною аварії в системі. При зростанні nLevel понад це значення буде повертатися порожній рядок. Приведений нижче код дозволяє простежити послідовність викликів, що привела до помилки:

ІnLevel = 1

DO WHILE! EMPTY(SYS(,16, InLevel))

? SYS(16, InLevel)

InLevel = InLevel+l

ENDDO