Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование на Delphi. От новичка до профессионала! 18.2 Что делать, если произошла ошибка выполнения


Информационный Канал Subscribe.Ru



18.2 Что делать, если произошла ошибка выполнения

Если ваше приложение откомпилировалось и стало выполняться, это ещё не означает, что оно правильно работает. В нём может быть еще множеств ошибок времени выполнения. Это могут быть постоянные логические ошибки, проявляющиеся всегда при выполнении некоторых частей вашей программы. Это могут быть ошибки, проявляющиеся только при каких-то сочетаниях данных: ошибки деления на нуль, переполнения, открытия несуществующего файла и т.п. Наконец, могут быть случайные перемежающиеся ошибки, когда одна и та же задача иногда выполняется нормально, а иногда — нет. Такие ошибки, которые наиболее трудно вылавливать, связаны обычно с отсутствием инициализации переменных в каких-то режимах работы. В этом случае выполнение приложения зависит от случайного состояния памяти компьютера.

Во всех подобных случаях причины ошибок выявляются в процессе отладки. Наше приложение тоже не свободно от ошибок времени выполнения. Запустите его на выполнение и щёлкните на кнопке. Все, вроде бы, работает нормально. Если начальное число в окне редактирования равнялось 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, на котором есть архив рассылки, также гостевая книга, переводчик.

Копировать, размещать, продавать представленную информацию запрещается.

 

Rambler's Top100



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное