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

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); 
        } 
    } 
}