29. [junior] debug-mode, bugs и борьба с ошибками в коде ActionScript

junior – серия статей для начинающих ActionScript-разработчиков.
Все статьи серии:
http://flashpress.ru/blog/category/junior/

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

debug mode

Флеш плеер существует в двух версиях: дебажный(debug) и релизный(release). Скачать дебаг плеер можно на сайте Adobe. Отличить дебажный flash плеер от релизного можно по виду контекстного меню. На картинки ниже слева показано меню дебажного плеера, а справа – релизного.

debugReleasePlayers

Если у пользователя стоит дебажный плеер и в коде произошла ошибка, плеер покажет всплывающее окно с информацией об ошибке. На картинке ниже видно что плеер показывает название функции в которой произошла ошибка:

errorNoDebug

Если вы хотите получить более подробную информацию об ошибке, например название файла и номер строки где произошла ошибка вам необходимо скомпилировать приложение в режиме debug. Режим debug во флешке используется для получения подробной информации о работе ActionScript приложения, в том числе и об ошибках. Редактор кода FlashBuilder по умолчанию компилирует приложение в режиме дебаг. Активировать принудительно или отключить дебаг режим в редакторе FlashBuilder можно с помощью ключа -debug=true/false в настройках проекта. Кликните правой кнопкой на название проекта, выберите пункт Properties, затем перейдите в раздел ActionScript Compiler в левом списке. В окне Additional compiler arguments напишите -debug=true/false для включения/отключения режима дебаг:

activeDebug

Что бы активировать debug режим в редакторе Adobe Flash Professional, откройте настройки публикации выбрав пункт меню File->PublishSettings. Далее выберите кликаем на кнопку с галочкой Flash в левом списке, и ставим галочку Permit debugging:

activeDebugFl

Имейте ввиду что в режиме debug скомпилированная флешка получается гораздо большего размера чем в режиме release. К тому же работает debug версия работает медленнее

Картинка внизу показывает как может выглядеть информационное окно с ошибкой во флешке с включенным debug режимом. Видно что флешка показывает номер строки с ошибкой:

errorDebug

В коде ActionScript можно узнать о том какая версия flash плеера установлена с помощью класса Capabilities:

 

Узнать в каком режиме скомпилирована флешка нельзя штатными средствами. Но есть замечательный класс SWFInfo(спасибо Dimarik за этот чудо класс :) ) который умеет определять режим флешки и различные мета данные. Скачать класс можно на сайте.

Кликните на кнопку что бы увидеть живое окно с ошибкой в режиме release:

Здесь должна быть флешка. Установите Flash Player


Кликните на кнопку что бы увидеть окно с подробной информацией об ошибке в режиме debug:

Здесь должна быть флешка. Установите Flash Player

Исходный код (кликните что бы развернуть)

try-catch

Основной инструмент для борьбы с ошибками это оператор try-catch. Он позволяет выделить куски ActionScript-кода, которые потенциально могут содержать ошибки:

Используйте этот метод в тех местах где теоретически может возникнуть ошибка и других способов поймать ошибку нет.

Не злоупотребляйте этим оператором, это может привести к падению FPS.

Ошибки загрузки ресурсов

Когда вы загружаете какой бы ни было файл, всегда есть опасность что этого файла там нет. Поэтому старайтесь везде где вы загружаете ресурс слушать события IOErrorEvent.IO_ERROR и SecurityErrorEvent.SECURITY_ERROR. Событие  IOErrorEvent.IO_ERROR вылетает когда файл нет, а SecurityErrorEvent.SECURITY_ERROR когда флешка не может загрузить из соображений безопасности. Подробнее про SecurityError и crossdomain я расскажу в отдельной статье, скоро :)

 

removeChild

Очень часто у начинающих разработчиков возникает ошибка в методе removeChild из-за того что у контейнера попросту нет дочернего объекта. Если в коде вы не уверены в наличии дочернего объекта, прежде чем удалить его проверьте на содержание. Будьте внимательны используя метод contains, т.к. он вернет true если объект лежит внутри другого дочернего объекта, но при этом метод removeChild вернет ошибку. Пример выше сказанного в коде:

Stage

Еще один пример ошибки которую часто допускают начинающие flash-программисты – это попытка использовать свойство stage до того как объект был добавлен в список отображения. Что бы добавить объект в список отображения, нужно что бы сам объект и все его родители по иерархии выше были добавлены с помощью метода addChild. Подробно про список отображения я рассказывал в статье [junior] DisplayObject. Управление списком отображения (addChild/removeChild). Что бы исключить ошибку этого рода, обращайтесь к stage только после события Event.ADDED_TO_STAGE, как показано в примере:

 

Как поймать все возникающие ошибки

Очень трудно предусмотреть все случаи и обезопасить себя от всех ошибок. Для отлова всех возникающих ошибок воспользуйтесь событием UncaughtErrorEvent.UNCAUGHT_ERROR. Это событие надо слушать у объекта loaderInfo.uncaughtErrorEvents.

В этом коде trace выдаст сообщение вида:

Если вы загружаете флешку, то для отлова ошибок в загружаемой флешке надо слушать событие UncaughtErrorEvent.UNCAUGHT_ERROR у объекта Loader.uncaughtErrorEvents

Централизованный сбор ошибок

Для достижения большей эффективности вы можете сделать прослушивание события UncaughtErrorEvent.UNCAUGHT_ERROR в одном специальном классе. И в случае возникновения ошибки, например показывать пользователю сообщение и просьбой отправить логи на сервер, для дальнейшего анализа и устранения багов.

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 2859 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




Комментарии Facebook:




Комментарии WordPress: