MIME-Version: 1.0 Content-Location: file:///C:/EC2C4CD5/5.htm Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="us-ascii" 5

5. Метод= ;ы отладки и борьбы с ошибками

От ошибок никт = 86; не застраховаl= 5;, и они случаю= 090;ся даже у опытных программисm= 0;ов. Таким образ = 86;м, все сводитс = 03; к тому, чтоб = 99; их поскорее обнаружить. Допустим, сделана опечатка и неправильнl= 6; написано какое-нибуд = 00; ключевое сл = 86;во. В этом случае при попытке запуска про = 75;раммы внизу появляется окно, в котором ото = 73;ражены сообщения о = 73; ошибках. При этом програ = 84;ма не запустится. Благодаря подсказке такую ошибк = 91; легко найти = 080; исправить.

Частой ошибкой начинающих является пропуск кон = 89;трукции begin – end в цикле. При этом имеется в ви= 076;у, что в цикле должны выполнятьсn= 3;, например, об= 077; команды, но на самом-то деле в цикле, конечно, будет выполнятьсn= 3; только перв = 72;я, а вторая выполнится только один раз – потом, когда программа выйдет из ци= 082;ла. При попытке запуска появляется сообщение. Н= 086; это не ошибка, а предупреждk= 7;ние. В нем обращается внимание на то, что параметр цикла после выполнения цикла может быть неопределеl= 5;ным (он присутст= 074;ует во второй команде). 

Однако, несмотря на предупреждk= 7;ние, программа м = 86;жет запуститьсn= 3;. Если вводятся дкакие-либо данные, то по&#= 1103;вляется сообщение о = 73; исключителn= 0;ной ситуации – exception.= При этом програ = 84;ма приостанавl= 3;ивается, переходя из режима исполнения = 74; режим отладки. Что= 073;ы перейти к обычному редактировk= 2;нию кода, лучше остановить программу. j= 9;то можно сдела = 90;ь с помощью команды Program Reset. Затем можно поправить ошибку и вновь запустить программу.

В большие программы всегда закрадываюm= 0;ся ошибки. Их на&#= 1076;о быстро и квалифицирl= 6;ванно найти и исправить. М= 077;ханизм исключителn= 0;ных ситуаций (exception) – одно из больших достоинств Delp= hi. С их помощью вы можете контролироk= 4;ать возникновеl= 5;ие ошибок и создавать в результате устойчивые = 82; ошибкам про = 75;раммы.

По мере знакомства = 89; языком и средой прог = 88;аммист проходит несколько этапов. На первом этап = 77; он, по незнанию, путает типы, забывает ставить знаки препинания (например, то&#= 1095;ку с запятой в конце строки), некорректнl= 6; использует операторы и т.п. В результате написанный им код в принципе не = 74;озможно исполнить. И это хорошо – поскольку д= ;опущенные им ошибки оказываютсn= 3; автоматичеl= 9;ки выявленнымl= 0; на этапе компиляции, более того, часто среда программирl= 6;вания сама подсказываk= 7;т, какая ошибк = 72; допущена, и, что важно, ук&#= 1072;зывает строку, которую нужно поправить. П= 086; мере изучения языка и борьбы с синтаксичеl= 9;кими ошибками программисm= 0; плавно пере = 93;одит к следующем = 91; этапу. Тепер= 100; он уже не дел&#= 1072;ет таких простейших ошибок, но, поскольку сложность его програм = 84; возрастает, возрастает = 80; вероятностn= 0; совершения им ошибки, пр&#= 1080; которой программа все равно запустится. Поскольку, с точки зрени = 03; компиляторk= 2;, явной ошибк = 80; нет, а некоторые странности кода, по-видимому, являются замыслом программисm= 0;а. Однако компилятор все-таки сообщает об этих странностяm= 3; с помощью предупреждk= 7;ний (Warning). Советуем всегда обращать на них внимани = 77;, проверять при их появлении, нет ли ошибк= 080;, и вообще стараться писать код так, чтобы не было предупреждk= 7;ний.

Опасность таких скрытых ошибок состоит:

1)      в том, что они таятся в той части кода, которую программисm= 0; написал и уверен, что она правильная (= 087;рограмма запустиласn= 0;), а значит, и не очень внимательнl= 6; будет искат = 00; ошибку;

2)      в том, что проявляетсn= 3; эта ошибка совсем в дру= 075;ом месте кода – не в том, в котором допущена. А это приводи = 90; к долгим поискам ее п= 086; всей програ = 84;ме.

Наконец, когда программисm= 0; становится уже опытным = 080; приступает = 82; сложным проектам, св= 103;занным с использоваl= 5;ием объектов, ук= 072;зателей и т.п., на его пути стоят е= 097;е более опасные ошибки, о которых компилятор не выдает даже предупреждk= 7;ний. А ошибки эти весьма серьезные, поскольку они, в основн&#= 1086;м, связаны с некорректнl= 6;й записью в па= 084;ять и могут привести к непредсказm= 1;емым последствиn= 3;м.

При возникновеl= 5;ии исключителn= 0;ной ситуации мо = 78;но проигнорирl= 6;вать ее и запустить исполнение программы дальше, нажа= 074; F9. В этом случае программа выдает сообщение о = 73; ошибке. Необ= 093;одимо найти ошибку – понять, в какой строк = 77; и почему происходит сбой. Для этого можно воспользовk= 2;ться трассировкl= 6;й. Для того чтобы определить первую строчку, нач= 080;ная с которой будет проводитьсn= 3; трассировкk= 2;, нужно поставить Breakpoint – точку останова.

Когда исполняемыl= 1; код доходит до точки ост= 072;нова, исполнение программы приостанавl= 3;ивается, и надо перей= 090;и в режим отла= 076;ки. В режиме отладки можно исполнять последоватk= 7;льно программу п = 86; шагам, контролироk= 4;ать и изменять значения переменных = 80; т.п. Этот режим служи = 90; для обнаружениn= 3; и ликвидаци = 80; ошибок. В этом случае появляется возможностn= 0; просмотретn= 0; или изменит = 00; текущие зна = 95;ения переменных, однако изменение кода во врем= 103; отладки невозможно. Измененный текст зараб = 86;тает только посл = 77; перезапускk= 2; программы.

Чтобы выполнить текущую строку, на которой стоит курсо = 88; отладки, нажмите F7 или = F8. Строка выполниласn= 0;, и курсор сместился. Если необходимо перейти к следующей строке, то можно нажат = 00; F8, если нужно зайти в какую-либо функцию, то нажимают клавишу F7 и продолжают = 90;рассировку.<= /p>

Для того чтобы в ходе отладк = 80; узнать знач = 77;ние той или иной переменной, нужно прост = 86; подвести к ней курсор. П&#= 1086;явится hint со значением этой переменной.

Это, однако, работает не со всеми переменнымl= 0;, а только с доступными = 74; данный момент. Если нужно постоянно контролироk= 4;ать значение переменной, то еще проще добавить ее = 074; список Watch. Для более основательl= 5;ого слежения за значениями можете воспользовk= 2;ться Списком Наблюдения (Wat= ch List, Ctrl+F5).

Таким образом, при программирl= 6;вании среда Delphi може = 90; находиться = 74; различных режимах:

Чтобы продолжить трассировкm= 1; (последоват = 77;льный переход от команды к команде), можете воспользовk= 2;ться клавишами:

При работе в Delphi сообщение о = 73; ошибке фактически появляется дважды: сначала выводится о = 82;но об исключителn= 0;ной ситуации и программа приостанавl= 3;ивается, а потом, если нажать F9 (F8, F7 и т.п.), – возникает стандартноk= 7; сообщение о = 73; ошибке Windows.

Итак:=

  1. Произоm= 6;ла ошибка.
  2. Програl= 4;ма приостанав= ливается.
  3. Выводиm= 0;ся сообщение об exception. Это сообщение для программис= та. Среда Delphi сооб= ;щает, что программа не в состоянии выполнить какую-то свою команду. Программис= т не предусмо= ;трел возможност= ь исключител= ьной ситуации.  Сред&= #1072; Delphi приостанав= ливает программу, чтобы программис= т разобрался, где и в чем ошибка. Отключить прио= становку (2)–(3) &= #1084;ожно, сн= яв флаж= ок Menu =3D> Tools =3D= > Debugger Options =3D> Language Exceptions =3D> Stop on Delphi Ex= ceptions.
  4.  Наж&#= 1072;тие клавиши F9 (F8, F7 или др.).
  5. Выводиm= 0;ся сообщение об ошибке. Э = 90;о сообщение для пользовате= ля программы (ситуация запуска приложения не из Delphi, а через exe-файл из Windows, т.е. не существову= ет пунктов 2, 3, 4).
  6. Програl= 4;ма продолжает= ся (при этом он = 72; не сумела выполнить ту часть, в которой произошла ошибка, и значит, еслl= 0; эта часть важная, продолжени= е может сопро= ;вождаться дальнейшим= и ошибками).

Механизм обработки исключителn= 0;ных ситуаций заключаетсn= 3; в том, что есл&= #1080; произошла ошибка (1) и не надо выводить (5), пр= ;едпринимаю = 90;ся действия, чтобы (6) исполнялосn= 0; корректно. Д= 083;я этого «опас = 85;ая» команда (или целый блок) помещается внутрь конс = 90;рукции try..except..end или try..finally..end.

Блок try..finally..end используетl= 9;я аналогично try..except.., но с тем отличием, чт= 086; блок команд между finally и end выполняетсn= 3; в любом случае, вне зависимостl= 0; от того, было исключение между try и finally илl= 0; нет.