Если ваше приложение откомпилировалось и стало выполняться, это ещё не означает,
что оно правильно работает. В нём может быть еще множеств
ошибок времени выполнения. Это могут быть постоянные логические ошибки,
проявляющиеся всегда при выполнении некоторых частей вашей программы. Это могут
быть ошибки, проявляющиеся только при каких-то сочетаниях данных: ошибки деления
на нуль, переполнения, открытия несуществующего файла и т.п. Наконец, могут быть
случайные перемежающиеся ошибки, когда одна и та же задача иногда выполняется
нормально, а иногда — нет. Такие ошибки, которые наиболее трудно вылавливать,
связаны обычно с отсутствием инициализации переменных в каких-то режимах работы.
В этом случае выполнение приложения зависит от случайного состояния памяти
компьютера.
Во всех подобных случаях причины ошибок выявляются в процессе отладки. Наше
приложение тоже не свободно от ошибок времени выполнения. Запустите его на
выполнение и щёлкните на кнопке. Все, вроде бы, работает нормально. Если
начальное число в окне редактирования равнялось 10, то результат будет равен
"1Е32", т.е. 10^32. Попробуйте повторно щёлкнуть на той же кнопке. Вы увидите в
окне редактирования результат — текст "INF". Это означает, что значение А
превысило предел, допустимый для своего типа — real. В версиях,
предшествующих Delphi 7, в подобных случаях генерировалось исключение, в
обработчике которого можно было принимать какие-то меры. Но в Delphi 7 и 6,
благодаря введенным нами операторам, мы отключили генерации исключений при
выполнении арифметических операций. Поэтому в случаях переполнения и деления на
нуль результат становится равным константам Infinity — положительная
бесконечность, или Neglnfinity — отрицательная бесконечность. Это вы и увидели в
окне редактирования.
Нажмите кнопку вашего приложения в третий раз. Выполнение прервётся и перед вами
возникнет окно с сообщением об ошибке:
Project Project1.exe raised exception class EConvertError with message ‘’INF’
is not valid floating point value’. Process stopped, Use Step or Run to continue.
Перевод текста в этом окне гласит: "Проект Project1.exe вызвал генерацию
исключения класса EConvertError с сообщением " 'INF' не является допустимым!
значением с плавающей запятой". Процесс остановлен. Используйте команды Step или
Run для продолжения".
Это окно отладчика Delphi. Пользователь, работая с нашим приложением, подобного
окна не увидит. Ему будет показано только окно с сообщением: ‘INF’ is not
valid floating point value.
Сообщения отладчика можно отключить. Для этого надо выполнить команду Tools |
Debugger Options и на странице Language Exceptions окна настройки
отладчика выключить опцию Stop On Delphi Exceptions.
Исключения (exceptions) генерируются при различных ошибках — так называемых
исключительных ситуациях. Действительно текст "INF" невозможно перевести в
число. Существуют специальные синтаксические конструкции перехвата и обработки
исключений. Сейчас пока перед нами стоит вопрос: Что делать? Щёлкнув на кнопке
ОК вы попадете в окно Редактора Кода.
Дальнейшие ваши действия сводятся к одной из следующих альтернатив…
- Можно нажать клавиши Ctrl-F2 и тем самым прервать выполнение и отладку
приложения.
Это, конечно, возможный вариант действий, если вы уже поняли, в чём заключается
ошибка, и готовы ее исправить (впрочем, в нашем примере ошибка тривиальна —
значение А = "INF"). Если же нет, то вам придется анализировать ситуацию,
обдумывать возможные варианты ее исправления и т.д. Если неясно, в чем
заключалась ошибка, прервавшая выполнение приложения, то не тратьте силы на
размышления. Прежде, чем прерывать сеанс работы с приложением, надо получить
дополнительную информацию о состоянии переменных, т.е. провести отладку. А потом
уже можно обдумывать ситуацию, имея на руках данные.
- Можно выполнить команду Run | Run (или нажать соответствующую быструю
кнопку, или клавишу F9), чтобы попытаться, несмотря на ошибку, продолжить
вычисления.
При этом управление вернётся в приложение, и, перейдя в него, вы увидите окно с
сообщением о виде ошибки. После этого вы можете продолжать работать с
приложением. Но это ни к чему не приведёт, так как при очередном щелчке на
кнопке ситуация с ошибкой повторится.
- Вы можете пройти часть программы по шагам, как будет рассмотрено в одном из
следующих уроков. Но прежде, чем это делать, вам надо получить какую-то
информацию. Иначе такой проход ничего вам не даст.
Итак, единственно правильный способ действий, если причина ошибки неясна:
- Надо получить информацию о происходящих в приложениях процессах, приведших к
ошибке.
Это можно сделать несколькими способами. Во-первых, в ИСР Delphi имеется Мастер
оценки выражений — ToolTip Expression Evaluation. Правда, чтобы он
работал, надо, чтобы программа начала продолжать выполнение в пошаговом режиме
после генерации исключения. О пошаговом режиме вы скоро узнаете. А пока, если у
вас никакая строка в Редакторе Кода в данный момент не выделена, нажмите F7.
После этого вы можете подвести курсор мыши к имени любой переменной или к имени
свойства (например, к Edit1.Text) и увидеть ярлычок с текущим значением
переменной или свойства.
Правда, всё удобство этого инструмента мы увидим позднее при рассмотрении режима
пошагового выполнения. А сейчас в нашем примере, значение А = “+INF”, цикл не
выполнялся, так что значение i – случайная величина. Поэтому смотреть
особо нечего.
Сайт
рассылки http://mydelphi7.narod.ru,
на котором есть архив рассылки, также гостевая книга, переводчик.
Копировать, размещать, продавать представленную информацию
запрещается.