Статьи

Совет: как отладить ошибку AS3 # 2044

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


Давайте начнем с настройки некоторого кода в файле Flash, который выдает ошибку 2044. Создайте новый файл AS3 Flash и введите этот код на панель «Сценарий»:

1
2
var loader:Loader = new Loader();
loader.load(new URLRequest(«some-non-existant.url»));

Идите вперед и запустите SWF, и вы должны увидеть эту ошибку:

1
Error #2044: Unhandled IOErrorEvent:.

Вы увидите ту же ошибку с небольшим изменением, если мы просто изменим Loader на URLLoader , как URLLoader ниже:

1
2
var loader:URLLoader = new URLLoader();
loader.load(new URLRequest(«some-non-existant.url»));

Вы должны увидеть что-то вроде этого, только если путь к файлу отражает вашу среду:

1
2
Error #2044: Unhandled ioError:.
    at Untitled_fla::MainTimeline/frame1()

Как вы можете догадаться из того факта, что ошибка 2044 возникает при использовании Loader и URLLoader , эта ошибка связана с загрузкой внешних файлов.

На самом деле ошибка связана с невозможностью загрузить внешний файл. Как подсказывает поддельный URL в моих фрагментах кода, у файла, который мы пытаемся загрузить, есть какая-то проблема. Скорее всего, это тот случай, когда файл недоступен; это может быть просто неправильно записанный URL-адрес, или динамически создаваемый URL-адрес, приводящий к неправильному расположению, или из-за того, что сервер или сеть в данный момент не работают

Однако ошибка 2044 не обвиняет вас в загрузке плохого файла. Это произойдет. Мы не можем контролировать сеть, поэтому сбой загрузки обязательно произойдет в какой-то момент. Ошибка 2044 обвиняет вас в том, что вы не готовы к тому, когда это произойдет.


Как Loader и URLLoader являются диспетчерами событий, как вы должны знать, работая с ними. Вам необходимо использовать событие Event.COMPLETE , чтобы узнать, когда нагрузка готова для работы с ней. Однако, если вы читаете это, вы можете не осознавать, что эти классы загрузки также отправляют другие события, в частности, событие IOErrorEvent.IO_ERROR .

Когда Loader или URLLoader ошибку, например, как описано в предыдущем шаге, он отправит событие IOErrorEvent.IO_ERROR . Это специализированное мероприятие для таких случаев, как это. Он содержит text свойство, которое описывает природу ошибки, как видно из ошибок, которые мы создали на первом шаге; оба фрагмента кода выдавали ошибку 2044, но текст каждого отличался (хотя семантически он был одинаковым).

Однако, в отличие от большинства событий, когда IOErrorEvent события IOErrorEvent , диспетчер проверяет наличие хотя бы одного прослушивателя событий. Если он не находит ничего, он выдает необработанную ошибку ввода-вывода.

Таким образом, решение простое: просто добавьте прослушиватель события IOErrorEvent.IO_ERROR в ваши загрузчики. Даже если слушатель ничего не делает, он, по крайней мере, подавит ошибку 2044, просто существуя.

1
2
3
4
5
6
7
var loader:URLLoader = new URLLoader;
loader.load(new URLRequest(«some-non-existant.url»));
loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
 
function onError(e:IOErrorEvent):void {
    // Do nothing
}

Помните, что вы добавляете события в свойство contentLoaderInfo объектов Loader , а не непосредственно в Loader :

1
2
3
4
5
6
7
var loader:Loader = new Loader();
loader.load(new URLRequest(«some-non-existant.url»));
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
 
function onError(e:IOErrorEvent):void {
    // Do nothing
}

Тем не менее, вы должны быть лучше подготовлены, чем это, как бойскаут; в идеале вы должны определить, какое будет соответствующее действие, а затем запустить это действие в функции обработчика событий. Вы можете решить вместо этого загрузить изображение «image not found» или файл XML по умолчанию. Вы можете представить пользователю предупреждение, уведомляющее его о том, что требуемый ресурс не может быть загружен, и повторите попытку позже. Возможно, вы также отключаете части своего SWF-файла, потому что требуемые данные не могут быть загружены. Вы можете даже отправить сообщение в журнал на стороне сервера с подробностями, чтобы вы могли разобраться в ситуации.


Как я уже говорил, это довольно легко, правда. Просто нужно привыкнуть добавлять этот обработчик событий, чтобы вы больше никогда не видели ошибку 2044. Это не предотвратит сбой загрузки ресурсов, но может позволить вам изящно ухудшиться и восстановиться после сбоя настолько хорошо, насколько это возможно.

Спасибо за прочтение. Скоро я увижу вас в другом кратком совете по отладке.