Ответы на события ошибок и ошибки состояния

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Одним из наиболее значительных улучшений обработки ошибок в ActionScript 3.0 является поддержка реагирования на асинхронные ошибки при выполнении программы. (Определение асинхронных ошибок см. в разделе Типы ошибок ).

Для ответа на события ошибок можно создавать прослушивателей событий и обработчиков событий. Многие классы отправляют события ошибок тем же способом, что и другие события. Например, экземпляр класса XMLSocket при нормальных обстоятельствах отправляет события трех типов: Event.CLOSE , Event.CONNECT и DataEvent.DATA . Тем не менее, в случае возникновения проблемы класс XMLSocket может отправлять события IOErrorEvent.IOError или SecurityErrorEvent.SECURITY_ERROR . Дополнительные сведения о прослушивателях и обработчиках событий см. в разделе Обработка событий .

События ошибок подразделяются на две категории.

  • События ошибок, которые расширяют класс ErrorEvent

    Класс flash.events.ErrorEvent содержит свойства и методы для обработки ошибок выполнения, относящихся к сетевым и коммуникационным операциям. Классы AsyncErrorEvent, IOErrorEvent и SecurityErrorEvent расширяют класс ErrorEvent. При использовании отладочных версий среды выполнения Flash диалоговое окно информирует пользователя о всех событиях ошибок, с которыми сталкивается проигрыватель, без применения функций прослушивателя.

  • События ошибок, относящиеся к состоянию

    События ошибок, относящиеся к состоянию, связаны со свойствами netStatus и status классов сети и коммуникаций. Если среда выполнения Flash сталкивается с проблемой при чтении или записи данных, для свойств netStatus.info.level или status.level (в зависимости от класса используемого объекта) устанавливается значение "error" . Для ответа на эту ошибку необходимо проверить, содержит ли свойство level значение "error" в функции обработчика событий.

Работа с событиями ошибок

Класс ErrorEvent и его подклассы содержат типы ошибок, используемые для обработки ошибок, отправляемых средой выполнения Flash, когда они пытаются считывать или записывать данные.

В следующем примере используются и инструкция try..catch , и обработчики событий ошибки для отображения всех ошибок, обнаруженных в процессе чтения локального файла. Можно добавить более сложный код обработки для предоставления опций пользователю или для автоматической обработки ошибок в местах, обозначенных комментарием «your error-handling code here» (введите код обработки ошибок).

package 
{ 
    import flash.display.Sprite; 
    import flash.errors.IOError; 
    import flash.events.IOErrorEvent; 
    import flash.events.TextEvent; 
    import flash.media.Sound; 
    import flash.media.SoundChannel; 
    import flash.net.URLRequest; 
    import flash.text.TextField; 
    import flash.text.TextFieldAutoSize; 
 
    public class LinkEventExample extends Sprite 
    { 
        private var myMP3:Sound; 
        public function LinkEventExample() 
        { 
            myMP3 = new Sound(); 
            var list:TextField = new TextField(); 
            list.autoSize = TextFieldAutoSize.LEFT; 
            list.multiline = true; 
            list.htmlText = "<a href=\"event:track1.mp3\">Track 1</a><br>"; 
            list.htmlText += "<a href=\"event:track2.mp3\">Track 2</a><br>"; 
            addEventListener(TextEvent.LINK, linkHandler); 
            addChild(list); 
        } 
         
        private function playMP3(mp3:String):void 
        { 
            try 
            { 
                myMP3.load(new URLRequest(mp3)); 
                myMP3.play(); 
            } 
            catch (err:Error) 
            { 
                trace(err.message); 
                // your error-handling code here 
            } 
            myMP3.addEventListener(IOErrorEvent.IO_ERROR, errorHandler); 
        } 
 
        private function linkHandler(linkEvent:TextEvent):void 
        { 
            playMP3(linkEvent.text); 
            // your error-handling code here 
        } 
         
        private function errorHandler(errorEvent:IOErrorEvent):void 
        { 
            trace(errorEvent.text); 
            // your error-handling code here 
        } 
    } 
}

Работа с событиями изменения состояния

Среды выполнения Flash динамически изменяют значение свойств netStatus.info.level или status.level для классов, поддерживающих свойство level во время выполнения приложения. Классами, имеющими свойство netStatus.info.level , являются: NetConnection, NetStream и SharedObject. Классами, имеющими свойство status.level , являются: HTTPStatusEvent, Camera, Microphone и LocalConnection. Можно написать функцию обработчика для ответа на изменения значения level и отслеживания ошибок коммуникации.

В следующем примере функция netStatusHandler() используется для проверки значения свойства level . Если свойство level указывает на возникновение ошибки, код трассирует сообщение: «Video stream failed» (прерывание видеопотока).

package 
{ 
    import flash.display.Sprite; 
    import flash.events.NetStatusEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.media.Video; 
    import flash.net.NetConnection; 
    import flash.net.NetStream; 
 
    public class VideoExample extends Sprite 
    { 
        private var videoUrl:String = "Video.flv"; 
        private var connection:NetConnection; 
        private var stream:NetStream; 
 
        public function VideoExample() 
        { 
            connection = new NetConnection(); 
            connection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); 
            connection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
            connection.connect(null); 
        } 
 
        private function netStatusHandler(event:NetStatusEvent):void 
        { 
            if (event.info.level == "error") 
            { 
                trace("Video stream failed") 
            } 
            else  
            { 
                connectStream(); 
            } 
        } 
 
        private function securityErrorHandler(event:SecurityErrorEvent):void 
        { 
            trace("securityErrorHandler: " + event); 
        } 
 
        private function connectStream():void 
        { 
            var stream:NetStream = new NetStream(connection); 
            var video:Video = new Video(); 
            video.attachNetStream(stream); 
            stream.play(videoUrl); 
            addChild(video); 
        } 
    } 
}