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

2.2.1.Синтаксичні помилки

У практиці програмування розрізняють три класи помилок — логічні, синтаксичні і виключення. З них найбільше легко справитися — знайти і виправити — із синтаксичними помилками. В останній версії Visual FoxPro обробка синтаксичних помилок ще більш удосконалена. Але деякі помилки цього класу компілятором усе-таки не виявляються.

Найбільш розповсюджені варіанти синтаксичних помилок перераховані нижче.

  • Пропуск знака присвоєння чи знака іншої операції:

* Пропуск (=) после gnTotalDue

gnTotalDue pnNetDue * (1+lnTaxRate)

  • Уведення з помилкою імені функції чи команди Visual FoxPro:

* Пропущено второе 'А' в DATABASE

OPEN DATBASE ptofsale

У редакторі Visual FoxPro, що має опцію синтаксичного розфарбування, такі помилки виявляються надзвичайно просто. Усі зарезервовані ключові слова в ньому виводяться окремим кольором. Якщо при наборі імені команди, функції чи іншого ключового слова ви помилилися, то це слово буде виведено чорним кольором як звичайний текст. Настроювання кольору ключових слів виконується у вкладці Syntax Coloring діалогового вікна Options, що викликається на екран командою меню ToolsOptions. На цій вкладці в списку Area потрібно вибрати Keywords і установити кращу з вашого погляду комбінацію кольорів переднього плану і фону, що дозволить легко відрізняти синтаксичні елементи цієї категорії від інших3. Крім цього настроювання кольору, перевірте також, чи встановлений прапорець Syntax Coloring у діалоговому вікні Edit Properties. Останнє відкривається командою меню EditProperties.

  • Відсутність парності лапок, що обмежують строкові константи. Цей тип помилки іноді виникає через використання апострофа усередині константи, що сприймається компілятором у якості закриваючої одиночної лапки.

'This is Bill's statement' && Помилка!

“This is Bill's statement” && Правильно

Варіант цієї помилки — непогодженість початкового і кінцевого роздільників. Це буває, коли константа відкривається подвійними лапками, а завершується — одинарною.

І тут теж може допомогти синтаксичне розфарбування в редакторі Visual FoxPro. Таке її настроювання, при якому текстові константи виділяються кольором і відрізняються від іншого тексту, дозволить легко знайти описану непогодженість лапок. Можна виділяти строкові константи зміною кольору фону — наприклад, зробіть його жовтим чи ясно-зеленим. Тоді буде одразу видно, що константа не довершена потрібним обмежником. Visual FoxPro розрізняє наступні роздільники для строкових констант: одинарні лапки ('ххх'). подвійні лапки (“ххх”) і квадратні дужки ([ххх]). Таким чином, у вас завжди є простір для вибору, якщо виникає необхідність використовувати один з цих символів усередині константи (чи навіть будь-яких два з них).

  • Непарність круглих дужок у складних вираженнях:

REPLACE pnboxno WITH PADL(VAL(pnboxno+1, '0', 5)

Таку помилку можна знайти за допомогою опції Verify у діалоговому вікні Expression Builder. Це вікно використовується при побудові виражень у процесі розробки методів форм і класів. На жаль, опцію Verify не можна застосувати до виражень, що містять посилання на невідкриті таблиці. Хоча в принципі мова Visual FoxPro дозволяє практично необмежену вкладеність скобкових форм, не спід цим дуже захоплюватися. Чим вираження простіше, тим більше імовірність, що воно буде введено без помилок. Пошук відсутньої дужки у вираженні може виявитися задачею не з приємних уже при п'ятьох рівнях вкладеності. Краще розбийте складну скобкову форму на складові, значення яких можна зберігати в перемінні пам'яті4.

  • Використання зарезервованих слів як ідентифікатори перемінних у пам'яті чи імен полів. Зарезервовані слова, що Visual FoxPro використовує для позначення команд, системних функцій і ключових слів, не можна використовувати у якості позначення користувальницьких синтаксичних елементів (перемінних, процедур, полів і т. д.). Якщо ж таке станеться, то ви мимоволі поставите Visual FoxPro у тупик — система спробує виконати команду замість того, щоб прочитати значення перемінної. Що з цього може вийти, не знає ніхто, навіть Білл Гэйтс. У такому випадку порушується контекст застосування команди і Visual FoxPro сигналізує про це відповідним повідомленням. Наприклад, оператор, що приведений нижче, викликає появу повідомлення Invalid use of a Visual FoxPro function as an error (Неправильне використання функції Visual FoxPro у якості масиву).

DІMENSІON date[10]

  • Неузгодженість парних операторів (ключових слів) типу CASEENDCASE, DOENDDO, FORENDFOR, ІFENDІ, SCANENDSCAN. У Visual FoxPro така непогодженість приводить до повідомлення про помилку вкладеності.

IF gnTotalDue > 100

= MESSAGEBOX(“Get a supervisor's signature”)

ENDDO && Замість ENDDO повинно бути ENDIF

Типова синтаксична помилка, що вислизає від уваги компілятора — передача перемінної невірного типу як параметр функції чи процедури. Оскільки Visual FoxPro не відноситься до мов зі строгим синтаксисом визначення перемінних, останні під час виконання програми можуть приймати в пам'яті значення будь-якого типу. Таким чином, на стадії компіляції неможливо визначити, якого типу дані виявляться в майбутньому у тієї чи іншої перемінної. У результаті може виявитися, що параметр, від якого процедура очікує строкового значення, виявиться “зарядженим” цілочисельною величиною. У такому випадку помилка буде виявлена не на стадії компіляції, а на стадії виконання при виклику такої процедури.

При запуску програми Visual FoxPro перетворить вхідний програмний код в об'єктний, якщо раніше він не був відкомпільований, і дозволяє посилання на інші програми, процедури і функції. Visual FoxPro спочатку намагається дозволити ці посилання в межах поточного файлу чи у файлах, що включені до складу проекту. Припустимо, у програмі є виклик процедури SOMETHІ. Якщо процедура не буде знайдена, Visual FoxPro перериває процес компіляції і виводить на екран повідомлення Unable to find Proc./Function SOMETHІ (Не удається знайти процедуру/функцію SOMETHІ). У цьому ж діалоговому вікні є чотири кнопки — Locate (Знайти), Ignore (Ігнорувати), Ignore All (Ігнорувати усі) і Cancel (Скасування).

При виборі Locate Visual FoxPro виведе на екран вікно Open пошуку файлу і можна буде знайти файл що кудись запропав. Але врахуйте, при цьому проблема буде вирішена тільки для поточного сеансу роботи системи. (Вже не кажучи, що відшукувати вручну потрібний файл — заняття не з приємних. Тут таїться і ще одна “міна уповільненої дії”. В один не самий прекрасний день на диску вашого комп'ютера чи на серверах мережі, до якої він підключений, може з'явитися кілька однойменних файлів у різних “відсіках” файлової структури. Як згадати, який саме з них вам потрібний?) Виправити ситуацію назавжди (чи у всякому разі на досить тривалий час) можна, відредагувавши або програмний код, або склад файлів проекту.

Іноді можна ігнорувати подібне повідомлення (одне чи більш аналогічних повідомлень з різних фрагментів виконуваної програми). Таке можливо у випадку, якщо ви знаєте, що функція чи процедура, на яку не знайдена посилання, існує у виді окремого файлу чи у виді зовнішнього посилання. Часто це відбувається при передачі посилання на масив у процесі звертання до функції. Непорозуміння досить легко задовольнити, додавши в програму оператор EXTERNAL ARRAY <ім'я_масиву>

Варіант відповіді Ignore All можна використовувати також для того, щоб дозволити Visual FoxPro завершити компіляцію програми, направляючи при цьому всю інформацію про виявлені помилки у файл протоколу синтаксичних помилок (error fіle). Для настроювання виводу інформації про виявлені помилки у файл протоколу потрібно відкрити вкладку General діалогового вікна Options. У ній потрібно установити опцію Log Compilation Errors. Той же ефект дає і команда SET LOGERRORS ON у програмному коді. Після цього Visual FoxPro буде записувати інформацію про помилки, виявлені на стадії компіляції, у текстовий файл з розширенням. ERR, однойменний з файлом що компілюється. По завершенні компіляції можна переглянути цей файл, викликавши команду ProjectErrors, або у любому текстовому редакторі.

Якщо ж режим запису помилок у файл не встановлений, Visual FoxPro буде по закінченні компіляції виводити в рядку стану загальну кількість виявлених помилок. Це не дуже інформативно, особливо якщо врахувати, що повідомлення з'являється усього на кілька секунд.

У файлі протоколу ви знайдете наступну інформацію про кожну з виявлених помилок:

  • текст рядка програмного коду, у якій вона знайдена;

  • номер рядка програмного коду, у якій Visual FoxPro знайшов помилку5;

  • текст повідомлення про помилку.

Коли програма після коректування буде компілюватися повторно, Visual FoxPro автоматично замінить уміст файлу протоколу. Якщо при цьому помилок виявлено не буде, то результуючий файл протоколу виявиться порожнім.

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

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

  • Помилка в порядку передачі параметрів. Visual FoxPro розпізнає таку помилку тільки в тому випадку, якщо “переплутані” параметри несуть дані різних типів. У відповідь виводиться повідомлення Invalid function argument valuetypeor count (Невірні значення, тип чи кількість аргументів функції). Якщо ж переплутані параметри мають однакові типи, то помилка може бути виявлена вже як логічна, якщо, звичайно, Visual FoxPro зможе уловити щось підозріле в поводженні програми.

? TRANSFORM ('$$$,$$$.99', gnTotalDue) && Переплутано порядок параметрів

  • Передача некоректного значення в команду, що має обмежувальний список можливих значень аргументів. Наприклад, команда вимагає специфічного імені ключа. Будь-яке інше значення приведе до появи повідомлення про помилку, як, наприклад, у наступному операторі:

ON KEY LABEL FJ9 ZOOM WINDOW PROPERTIES FORM FROM 0,0 TO 10,10

  • Використання при звертанні до функції Visual FoxPro помилкової кількості параметрів чи відсутність необхідних параметрів. Передача недостатньої кількості параметрів у програму, спроектовану користувачем, не кваліфікується виконавчою системою Visual FoxPro як помилка. Проте, процедура, що одержала недостатню кількість параметрів, може спрацювати неправильно, оскільки передбачається, що непередані параметри мають значення. F.. Це може привести до появи помилок типу даних у наступних операторах процедури. Але передача занадто великої кількості параметрів буде виявлена виконавчою системою Visual FoxPro і приведе до виводу повідомлення Must specify additional arguments (Додаткові аргументи повинні бути специфіковані). У приведеному нижче операторі робиться спроба викликати функцію LEFT () для виводу на екран фрагмента рядка символів, але не передається кількість символів, який необхідно витягти з вихідного рядка. У результаті Visual FoxPro не буде знати, якої довжини рядок повинний бути сформований і переданий у програму, що викликала:

? LEFT (IcLastName) && Потрібно передати кількість символів, що витягаються

  • Уведення коми замість крапки чи навпаки. На більшості моніторів розрізнити з першого погляду, де кома, а де крапка, досить важко. Наприклад, приведений нижче оператор виконаний не буде, оскільки замість коми два параметри розділені крапкою:

LPARAMETERS ІnErrNum. ІcErrMessage