Отладка (статья написана для FLASH-5), страница 2

Ошибки времени выполнения могут быть весьма разнообразными и свидетельствовать о проблеме, вызванной не текущим рассматриваемым кодом, а неверным результатом более ранних действий. Допустим, например, что делается попытка использования значений, возвращенных командой loadVariables( ), отправленной серверу. Если сценарий Perl, отвечающий на команду, не предоставил верных данных в правильном формате, то исправлять нужно сценарий Perl. Сценарий Flash может быть совершенно верным, но не выполниться из-за полученных неверных входных данных.

В итоге мы приходим к важной технологии - оборонительному программированию. Множество реальных и потенциальных ошибок можно избежать, если всегда проверять ситуации, чреватые проблемами, которые называют контролем ошибок (error checking) либо, иногда, проверкой данных (data validation), если это относится к вводу, производимому пользователем. Например, прежде чем выводить вопросы вопросника, можно убедиться в том, что эти вопросы правильно загрузились. Можно проверить и каждый вопрос, чтобы быть уверенным в правильности его формата для вывода. Если полученные данные были введены неверным образом, следует вывести соответствующее сообщение об ошибке, которое позволит программисту или пользователю предпринять корректирующие действия.

19.1.1. Функция trace( )

В ActionScript мощнейшее средство выявление ошибок является также и простейшим: это функция trace( ). Как демонстрировалось на протяжении всей этой книги, функция trace( ) направляет значение выражения в окно Output в режиме тестирования. Например, если добавить в ролик такой код:

trace("hello world");

то в окне Output появится текст "hello world". Аналогично трассируется значение переменной:

var x = 5;
trace(x);  // Выводит 5 in в окно Output

С помощью функции trace( ) можно проверять состояние переменных, свойств и объектов и тем самым отслеживать ход выполнения кода. Источник проблемы часто можно обнаружить при проверке результата каждой операции сценария. Например, допустим, что некоторая функция должна возвращать значение, но с помощью команды trace( ) обнаруживается, что возвращается значение undefined (которое никак не выводиться в окно Output). В результате становится ясно, что нужно внимательно рассмотреть функцию и проверить, правильно ли в ней используется команда return для возврата осмысленного значения.

19.1.2. Команда List Variables

При воспроизведении Flash-ролика в режиме тестирования можно проверить значения текущих переменных, определенных в нем, с помощью команды Debug List Variables. Команда List Variables сообщает имена и местонахождение всех переменных, активных в ролике в данный момент, а также их значения. Так как функции и мувиклипы хранятся в переменных, команда List Variables показывает также функции и мувиклипы, имеющиеся в ролике.

В примере 19-1 приведен образец вывода после выполнения команды List Variables. Обратите внимание, что переменная rate показана как объявленная, но не определена undefined. Такие детали иногда трудно обнаружить с помощью функции trace( ), поскольку trace( ) преобразует значение undefined в пустую строку ("").

Пример 19-1. Образец выдачи команды List Variables

Level #0: 
  Variable _level0.$version = "WIN 5,0,30,0"
  Variable _level0.calcDist = [function]
  Variable _level0.deltaX = 194
  Variable _level0.deltaY = 179
  Variable _level0.rate = undefined
  Variable _level0.dist = 264
Movie Clip:  Target="_level0.clip1"
Movie Clip:  Target="_level0.clip2"

Обратите внимание, что обе команды - trace( ) и List Variables - дают только мгновенный снимок. Часто требуется следить за изменением переменной во времени или проверять изменение многократно. Следить за изменениями переменных позволяет отладчик (Debugger),который будет обсуждаться позднее.

19.1.3. Команда List Objects