Перехват необработанного IOErrorEvent во Flash AS3

#http #actionscript-3 #flash

#http #actionscript-3 #flash

Вопрос:

Ошибка # 2044: необработанное IOErrorEvent:. текст = Ошибка # 2036: загрузка не завершена.

Это то, что я вижу каждый раз, когда пытаюсь загрузить изображение, которого не существует, с помощью загрузчика. Я получаю список URL-адресов и не могу проверить, указывают ли они на что-нибудь полезное. Всякий раз, когда он сталкивается с 404, он выдает мне эту ошибку.

Я пытался перехватить ошибку со всеми доступными IOErrorEvent , которые есть (их 7), но ни один из них, похоже, не улавливает 404. Есть ли какое-либо другое сетевое событие, которое я могу искать, чтобы перехватить это условие?! Я чувствую, что упускаю что-то очевидное.

Чего бы мне действительно хотелось, так это иметь возможность перехватывать событие независимо от его описания и просто иметь с ним дело … вроде как

 myLoader.addEventListener(IOErrorEvent.*, dealWithError);
  

Но это незаконно. Я даже пытался перехватить

 HTTPStatusEvent.HTTP_STATUS
  

но это никогда не перезванивает, потому что, я полагаю, оно получает статус HTTP после обработки событий ошибок, поэтому, когда происходит сбой при «необработанном» событии ошибки, оно просто теряется. Есть ли события, которых нет в IDE, которые я пропускаю?

Любая помощь приветствуется.

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

1. Вы используете Loader или a URLLoader ?

2. Я использую Loader, потому что загружаю изображение в объект. Должен ли я использовать URLLoader, а затем передавать массив байтов в MC? Я сделаю это, если это решение

3. интересно… URLLoader ДЕЙСТВИТЕЛЬНО улавливает IO_ERROR и обрабатывает его правильно… Я предполагаю, что подход bytestream (какая УЖАСНАЯ ошибка!) это ответ… запишите это, я поставлю вам галочку. 🙂

4. обычно метод, предложенный в моем ответе, должен работать для загрузчика 🙂

Ответ №1:

если вы используете загрузчик; попробуйте добавить EventListener в contentLoaderInfo загрузчика, например

 myLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loaderIOErrorHandler);
  

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

1. ха! вот где они это спрятали … очень умно! (на самом деле, слишком умный наполовину).

2. я знал, что событие.complete было запущено там, поэтому было логично, что ошибка IOError была запущена и там 😉

3. Да, даже будучи разработчиком flash более 2 лет, я все еще иногда совершаю эту ошибку. ОЧЕНЬ раздражает.

Ответ №2:

Вы должны прослушать IOErrorEvent.IO_ERROR вашего объекта URLLoader.

 urlLoader.addEventListener(IOErrorEvent.IO_ERROR, loaderIOErrorHandler);
function loaderIOErrorHandler(errorEvent:IOErrorEvent):void{
    trace("ioErrorHandler: "   errorEvent);
}
  

Если вы отслеживаете объект event, то он должен дать вам некоторую информацию о том, что происходит.

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

1. Я не использовал URLLoader (хотя это оказалось альтернативным решением… чтение байтового потока и загрузка ЕГО в загрузчик), это объект Loader, который я использовал напрямую, и он не улавливает IO_ERROR

Ответ №3:

Похоже, что IOErrorEvent.IO_ERROR должно сработать. Также убедитесь, что вы используете URLLoader для извлечения изображения.

На основе примера из комментариев:

 package {

    import flash.display.Sprite;
    import flash.utils.ByteArray;
    import flash.display.Loader;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.net.URLLoaderDataFormat;
    import flash.geom.Rectangle;
    import flash.events.Event;

    public class Main extends Sprite {

        private var urlLoader:URLLoader = new URLLoader();

        public function Main() {
            urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
            urlLoader.load(new URLRequest("http://www.java2s.com/image2.jpg"));

           urlLoader.addEventListener(Event.COMPLETE, completeHandler);
           urlloader.addEventListener(IOErrorEvent.IO_ERROR, imageNotFound);
       }

       private function completeHandler(event:Event):void {
           var loader:Loader = new Loader();
           loader.loadBytes(urlLoader.data);
           addChild(loader);
       }

       private function imageNotFound(ev:Event):void{
        trace("File not found.");
       }
    }
}
  

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

1. @Dr.Dredel, убедитесь, что вы используете URLLoader как в примере выше.

2. согласен, но, пожалуйста, добавьте код для фактического рисования изображения, иначе это бессмысленно! 🙂 Вот пример … java2s.com/Code/Flash-Flex-ActionScript/Network /…

3. о, я понимаю … извините, я пропустил, как вы загружали его в загрузчик … хорошо … хорошо … если кто-нибудь посмотрит на этот ответ, пожалуйста, обратите внимание, что здесь отсутствует одна строка, в соответствии с которой вам нужно установить формат в ДВОИЧНЫЙ, иначе вы получите исключение при попытке загрузить данные в загрузчик … в противном случае, вышеуказанное работает.

4. вот дерьмо … ответ от Michiel Standaert — это «правильный» ответ на мой актуальный вопрос, но я поддержал ваш, поскольку это также отличное решение.

Ответ №4:

Вы пробовали

 loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandlerIOErrorEvent);
  

[ПРАВИТЬ]
Также включать события contentLoaderInfo?

 loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler );
  

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

1. да, вместе с 6 другими IOErrorEvents. НИ один из них не является виновником, и я не могу понять, как на самом деле выяснить, КАКУЮ ошибку он видит.

2. можете ли вы опубликовать весь связанный код для вашего объекта myLoader. Без вашего кода на данный момент мы просто предполагаем. Моя интуиция подсказывает мне, что вы что-то неправильно определяете. Также редактирую свой пост с дополнительной информацией.