Методи налагодження та боротьби з помилками
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Від помилок ніхто не застрахований і вони трапляються навіть у досвідчених програмістів. Таким чином, все зводиться до того, щоб їх якнайшвидше виявити. Припустимо, зроблено помилку і неправильно написано якесь ключове слово. У цьому випадку під час спроби запуску програми знизу з'являється вікно, в якому відображаються повідомлення про помилки. При цьому програма не запуститься. Завдяки підказці таку помилку легко знайти та виправити.
Частою помилкою початківців є пропуск конструкції begin – end у циклі. При цьому мається на увазі, що в циклі повинні виконуватися, наприклад, обидві команди, але насправді в циклі, звичайно, виконуватиметься тільки перша, а друга виконається лише один раз - потім, коли програма вийде з циклу. Під час спроби запуску з'являється повідомлення. Але це не помилка, а попередження. У ньому звертається увага, що параметр циклу після виконання циклу може бути невизначеним (він є у другій команді).
Однак, незважаючи на попередження, програма може запуститись. Якщо вводяться будь-які дані, то з'являється повідомлення про виняткову ситуацію - exception. При цьому програма зупиняється, переходячи з режиму виконання режиму налагодження. Щоб перейти до звичайного редагування коду, краще зупинити програму. Це можна зробити за допомогою команди Program Reset. Потім можна виправити помилку і знову запустити програму.
У великі програми завжди закрадаються помилки. Їх треба швидко та кваліфіковано знайти та виправити. Механізм виняткових ситуацій (exception) - одна з високих переваг Delphi. З їх допомогою ви можете контролювати виникнення помилок і створювати в результаті стійкі до помилокпрограми.
У міру знайомства з мовою та середовищем програміст проходить кілька етапів. На першому етапі він, за незнанням, плутає типи, забуває ставити розділові знаки (наприклад, крапку з комою в кінці рядка), некоректно використовує оператори тощо. У результаті написаний ним код у принципі неможливо виконати. І це добре -
оскільки допущені ним помилки виявляються автоматично виявленими на етапі компіляції, більше, часто середовище програмування сама підказує, яка помилка допущена, і, що важливо, вказує рядок, який потрібно виправити. У міру вивчення мови та боротьби з синтаксичними помилками програміст плавно переходить до наступного етапу. Тепер він вже не робить таких найпростіших помилок, але оскільки складність його програм зростає, зростає і ймовірність вчинення ним помилки, при якій програма все одно запуститься. Оскільки, з погляду компілятора, явної помилки немає, а деякі дива коду, мабуть, є задумом програміста. Однак компілятор все-таки повідомляє про ці дива за допомогою попереджень (Warning). Радимо завжди звертати на них увагу, перевіряти при появі, чи немає помилки, і взагалі намагатися писати код так, щоб не було попереджень. Небезпека таких прихованих помилок полягає у:
2) у цьому, що проявляється ця помилка зовсім на іншому місці коду - над тому, у якому допущена. А це призводить до довгих пошуків її у всій програмі.
Нарешті, коли програміст стає вже досвідченим і приступає до складних проектів, пов'язаних із використанням об'єктів, покажчиків тощо, на його шляху стоять ще небезпечніші помилки, про які компілятор не видає навіть попереджень. А ці помилки дуже серйозні, оскільки вони, в основному, пов'язані з некоректним записом на згадку і можутьпризвести до непередбачуваних наслідків.
У разі виняткової ситуації можна проігнорувати її і запустити виконання програми далі, натиснувши F9. У цьому випадку програма видає повідомлення про помилку. Необхідно знайти помилку - зрозуміти, в якому рядку і чому відбувається збій. Для цього можна скористатися трасуванням. Для того щоб визначити перший рядок, починаючи з якого проводитиметься трасування, потрібно поставити Breakpoint - точку зупинки.
Щоб виконати поточний рядок, на якому стоїть курсор налагодження, натисніть F7 або F8. Рядок виконався, і курсор змістився. Якщо необхідно перейти до наступного рядка, то можна натиснути F8, якщо потрібно зайти в будь-яку функцію, натискають клавішу F7 і продовжують трасування.
Для того, щоб у ході налагодження дізнатися значення тієї чи іншої змінної, потрібно просто підвести до неї курсор. З'явиться hint зі значенням цієї змінної.
Це, однак, працює не з усіма змінними, а лише з доступними на даний момент. Якщо потрібно постійно контролювати значення змінної, ще простіше додати її до списку Watch. Для більш ґрунтовного стеження за значеннями можна скористатися Списком Спостереження (Watch List, Ctrl+F5).
Таким чином, при програмуванні середовище Delphi може бути в різних режимах:
• Режим редагування - режим, в якому редагується код проекту, модифікується форма, додаючи на неї компоненти та налаштовуючи їх властивості. Це основний режим.
• Режим виконання програми - режим, в який середовище переходить, як тільки натиснуто клавішу F9 і було побудовано exe-файл. Фактично, в цьому режимі відбувається саме виконання exe-файлу проекту, що вийшов. Програма виконується так, ніби її викликали не з Delphi, а просто з Windows.
• Режим налагодження - можна перейти з режиму виконання програми. При цьому програму буде припинено (але не зупинено зовсім).
Щоб продовжити трасування (послідовний перехід від команди до команди), можна скористатися клавішами:
• F9 (Run) – продовжити програму, не трасуючи її.
• F8 (Step over) - виконується поточний рядок коду і переходять до наступного рядка.
• F7 (Trace Into) - те, що і F8, з тією відмінністю, що якщо в поточному рядку міститься виклик будь-якої функції або процедури, то потрапляють всередину цієї процедури і трасують її до кінця, потім з неї повертається наступному рядку (на який перейшли б відразу, якби натиснули F8).
• F4 (Run to Cursor) - перехід у режим виконання програми доти, доки не повинен буде виконано рядок, на якому стоїть текстовий курсор (аналогічно тому, якби була встановлена точка зупинки)
• Shift+F8 (Run Until Return) – процедура виконується до кінця.
• Ctrl+F2 (Program Reset) - зупинка трасування та перехід у режим редагування коду. (Іноді доцільніше, якщо це не загрожує помилками, продовжити виконання програми (F9) і вийти з неї нормально, закривши головну форму).
При роботі в Delphi повідомлення про помилку фактично з'являється двічі: спочатку виводиться вікно про виняткову ситуацію і програма зупиняється, а потім, якщо натиснути F9 (F8, F7 тощо), виникає стандартне повідомлення про помилку Windows. Отже:
1. Відбулася помилка.
2. Програма припиняється.
3. Виводиться повідомлення про виведення. Це повідомлення для програміста. Середа Delphi повідомляє, що програма не в змозі виконати якусь свою команду. Програміст не передбачив можливостівиняткової ситуації. Середовище Delphi призупиняє програму, щоб програміст розібрався, де й у чому помилка. Вимкнути зупинку (2)-(3) можна, знявши прапорець Menu => Tools => Debugger Options => Language Exceptions => Stop on Delphi Exceptions.
4. Натисніть клавішу F9 (F8, F7 або ін.).
5. Виводиться повідомлення про помилку. Це повідомлення для користувача програми (ситуація запуску програми не з Delphi, а через exe-файл з Windows, тобто немає пунктів 2, 3, 4).
6. Програма продовжується (при цьому вона не зуміла виконати ту частину, в якій сталася помилка, і отже, якщо ця частина важлива, продовження може супроводжуватись подальшими помилками).
Механізм обробки виняткових ситуацій у тому, що й відбулася помилка (1) і треба виводити (5), робляться дії, щоб (6) виконувалося коректно. Для цього "небезпечна" команда (або цілий блок) міститься всередині конструкції try..except..end або try..finally..end.
Блок try..finally..end використовується аналогічно до try..except. але з тією відмінністю, що блок команд між finally та end виконується у будь-якому випадку, незалежно від того, був виняток між try і finally чи ні.