14. Типы ошибок и методы отладки программ.
Причиной таких ошибок могут быть неправильно написанные ключевые слова, неверно примененные разделители или недопустимые комбинации операторов. Такие ошибки VisualBasicраспознает сразу после того, как курсор покидает только что написанную строку. Строка с синтаксической ошибкой выделяется красным цветом. После устранения ошибки выделение цветом снимается.
VisualBasicимеет средства, позволяющие не только обнаружить синтаксическую ошибку, но и избежать ее в процессе написания кода. К таким средствам относятся
– механизм контекстной подсказки (после написании ключевого слова появляется окно, в котором отображается полный синтаксис вводимого оператора или список аргументов используемой процедуры);
– автоматическое отображение списка элементов (например, после имени элемента управления появляется список всех свойств и методов, из которого можно выбрать требуемое);
– дополнение слова (при вводе нескольких начальных символов, достаточных для распознавания ключевого слова, недостающие символы автоматически добавляются).
2. Ошибки в структуре программы.
Ошибки такого рода появляется в результате неправильного написания многострочного оператора (например, в операторе цикла Forнет последней строки со словомNext или в уловном оператореIfнетEnd If).
Такие ошибки VisualBasicраспознает не в процессе ввода символов, а на этапе компиляции. Сообщение об ошибке выводится в специальном окне и начинается оно словамиCompileerror(«ошибка компиляции») и содержит указание на ошибку (например,BlockIfwithoutEndIf– «блокIfбезEndIf»).
3. Ошибки, возникающие во время выполнения программы.
Это ошибки, возникающие во время работы программы (например, при выполнении деления на ноль или при попытки чтения из несуществующего на диске файла). В таких случаях выводится сообщение в специальном окне, в котором указывается причина прерывания программы и номер ошибки. На этом окне есть четыре кнопки «Continue», «End», «Debug» и «Help».
В качестве примера на рис.33 показано окно с сообщением об ошибке деления на ноль.
Рис.33. Вид окна с сообщением об ошибке на этапе выполнения
Из рисунка видно, что надпись на кнопке «Continue» бледнее остальных. Это означает, что при такой ошибке дальнейшее продолжение программы невозможно. Контур кнопки «Debug» выделен жирной линией, это означает, что для перехода в режим отладки эту кнопку можно «нажать» не только с помощью манипулятора «мышь», но и путем нажатия кнопки «Enter» клавиатуры. Нажатие кнопки «End» приведет к завершению программы, а кнопки «Help» – к появлению окна справки с информацией о типе ошибки и возможности ее устранения.
При переходе в режим отладки открывается окно с текстом программы, в которой выделена строка с командой, выполнение которой привело к прерыванию. При этом появляется возможность определить значения переменных на момент выполнения прерывания. Для этого достаточно подвести курсор к имени переменной, в появившемся окошке появится либо ее значение, либо слово «Empty» («пустая»), если на момент выполнения команды переменная не получила никакого значения.
На этапе разработки программы можно предусмотреть перехват возможных ошибок. Это делается с помощью специальной процедуры – обработчика ошибок.
Для перехвата возможной ошибки в исполняемой процедуре используется оператор On Error. В нем указывается метка, которая должна находиться в той же процедуре и помечать тот фрагмент кода, куда будет осуществлен переход при возникновении ошибки выполнения. Обычно этот фрагмент находится в конце процедуры, а перед меткой помещается операторExit, благодаря которому процедура завершается, если ошибка не возникла.
Обработка ошибки начинается с установления типа ошибки. Для этого используется объект Err, свойство которогоNumber содержит код последней возникшей ошибки.
После обработки ошибки программа должна продолжить свое исполнение. Для того, чтобы программа продолжала выполняться в строке, в которой возникла ошибка, в обработчике указывается оператор Resume. Если нужно продолжить программу не с этой, а со следующей строки, используется операторResume Next.
В качестве примера рассмотрим процедуру, которая запускается при нажатии кнопки со знаком «/» в проекте «Простой калькулятор» (Лекция №№). При этом число, введенное в текстовое окноText1делится на число, введенное в окноText2, результат заносится в окноText3. Возможная ошибка – деление на ноль. Обработка ошибки может выглядеть следующим образом.
Private Sub Command3_Click()
On Error GoTo ошибка
Z= Val (InputBox(“Введите число, не равное нулю”))
Если в программе возможно появление нескольких ошибок, их можно обработать, предварительно определив их код и в зависимости от кода применить тот или иной метод. В табл.11 приведены описания основных ошибок этапа выполнения программы.
Таблица 11. Коды основных ошибок
9.4 С ИНТАКСИЧЕСКИЕ ОШИБКИ
Это можно проиллюстрировать следующим примером. while x > y ; begin < something >end .
248 Никакого сообщения об ошибке при встрече «;» на данной стадии син- таксический анализатор не выдаст. Последствия ее могут появиться на более поздней фазе анализа. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · Сообщив о синтаксической ошибке, анализатор в большинстве случаев постарается продолжить разбор. Для этого ему понадобится исключить ка- кие-либо символы, включить какие-либо символы или изменить их. Суще- ствует ряд стратегий исправления ошибок. Практически все они хорошо сра- батывают в одних случаях и плохо – в других. «Хорошая» стратегия заклю- чается в том, чтобы обнаружить как можно больше синтаксических ошибок и генерировать как можно меньше сообщений в связи с каждой синтаксиче- ской ошибкой. Обычно наилучшими методами являются методы, зависимые от языка, т.е. от знания исходного языка и от того, как он употребляется.
9.4.1 М ЕТОДЫ ИСПРАВЛЕНИЯ СИНТАКСИЧЕСКИХ ОШИБОК
Режим переполоха . Один из наиболее распространенных методов ис- правления синтаксических ошибок носит название « режим переполоха ». При появлении недопустимого символа весь последующий исходный текст, вплоть до соответствующего ограничителя (например, «;» или end ), игнорируется. Ограничитель заканчивает какую-то конструкцию языка, и элементы удаляются из стека разбора до тех пор, пока не встретится адрес возврата. Этот элемент тоже удаляется из стека, а разбор продолжается, начиная с адреса в таблице разбора, содержащего следующий входной сим- вол. Такой метод довольно легко реализуется, но имеет серьезный недоста- ток: длинные последовательности кода, соответствующие игнорируемым символам, не анализируются. Исключение символов . Метод исключения символов также легко реа- лизуется и не требует изменения степени разбора. Когда считывается недо- пустимый символ, и он сам, и все последующие символы исключаются из
249 исходной строки до тех пор, пока не встретится допустимый символ. Хотя при таком методе могут исключаться длинные последовательности, в от- дельных случаях он весьма эффективен.
· · · · · · · · · · · · · · · · · · · · · · · · | Пример · · · · · · · · · · · · · · · · · · · · · · · |
Например, в записи c := d +3; end , где символ «;» является недопустимым, исправление ошибки – идеальное. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · Однако исключение скобок обычно разрушает блочную структуру и приводит к дальнейшим синтаксическим ошибкам. Включение символов . Некоторые синтаксические анализаторы имеют наготове множество действительных символов продолжения. В некоторых случаях оправдано исправление программ путем включения символов – под- становки одного из таких символов перед недопустимым символом, который вызвал ошибку.
· · · · · · · · · · · · · · · · · · · · · · · · | Пример · · · · · · · · · · · · · · · · · · · · · · · |
Например, последовательность end begin никогда не будет допустимой. Однако включение «;» между end begin позво- лит анализатору продолжить работу. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · Конечно, в таких ситуациях может иметь место неправильная подста- новка, даже если анализатор продолжит работу. Правила для ошибок . Один из способов исправления некоторых ти- пов синтаксических ошибок заключается в расширении синтаксиса языка за
250 счет включения в него программ, содержащих типичные ошибки. Это не зна- чит, что ошибки пройдут незамеченными, так как в грамматику могут быть включены сообщения о них. Но анализатор не будет считать такой вход не- допустимым и не потребует никаких исправлений.
· · · · · · · · · · · · · · · · · · · · · · · · | Пример · · · · · · · · · · · · · · · · · · · · · · · |
Так, можно обращаться, например, с ошибками типа «;» перед end или пропуск «;». · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · Дополнительные правила, включенные в грамматику, обычно называ- ются правилами для ошибок . Они неизбежно приводят к увеличению грамма- тики, и поэтому включать их следует только для наиболее часто встречаю- щихся ошибок программирования. При этом надо следить за тем, чтобы при включении этих правил грамматика не стала неоднозначной.
9.4.2 П РЕДУПРЕЖДЕНИЯ
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · Наряду с сообщениями о синтаксических ошибках, анали- затор может выдавать предупреждения , когда ему встрети- лась допустимая, но маловероятная последовательность симво- лов. · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · | Пример · · · · · · · · · · · · · · · · · · · · · · · |
Пример маловероятной последовательности символов: ; do · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
При подготовке материала использовались источники:
https://studfile.net/preview/6154379/page:15/
https://studfile.net/preview/16875961/page:45/