Reagowanie na zdarzenia błędu i status

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Jednym z najbardziej zauważalnych udoskonaleń w obsłudze błędów w języku ActionScript 3.0 jest wsparcie obsługi zdarzenia błędu w celu reagowania na asynchroniczne błędy w czasie działania aplikacji. (Definicje asynchronicznych błędów zawiera sekcja Typy błędów ).

Programista może utworzyć detektory zdarzeń i moduły obsługi zdarzeń w celu reagowania na zdarzenia błędu. Wiele klas wywołuje zdarzenia błędu w ten sam sposób co inne zdarzenia. Na przykład: instancja klasy XMLSocket wywołuje zazwyczaj trzy zdarzenia: Event.CLOSE , Event.CONNECT i DataEvent.DATA . Jednak w chwili wystąpienia problem klasa XMLSocket może wywołać IOErrorEvent.IOError lub SecurityErrorEvent.SECURITY_ERROR . Więcej informacji o detektorach zdarzeń i modułach obsługi zdarzeń zawiera sekcja Obsługa zdarzeń .

Zdarzenia Error można podzielić na dwie kategorie:

  • Zdarzenia Error rozszerzające klasę ErrorEvent

    Klasa flash.events.ErrorEvent zawiera właściwości i metody do zarządzania błędami czasu wykonywania powiązanymi z pracą w sieci oraz operacjami komunikacyjnymi w działającej aplikacji. Klasy AsyncErrorEvent, IOErrorEvent i SecurityErrorEvent rozszerzają klasę ErrorEvent. Podczas korzystania ze środowiska wykonawczego Flash w wersji z debugerem, w czasie wykonywania, zostanie wyświetlone okno dialogowe informujące o wszystkich zdarzeniach błędu bez funkcji detektorów, na które napotkał odtwarzacz.

  • Zdarzenia błędu oparte na statusie

    Zdarzenia błędu oparte na statusie powiązane są z właściwościami netStatus i status klas dotyczących pracy w sieci i komunikacji. Jeśli środowisko wykonawcze Flash napotka na problem podczas odczytywania lub zapisywania danych, wartość właściwości netStatus.info.level lub status.level (w zależności od używanego obiektu klasy) ustawiane są na wartość "error" . Zareagować na ten błąd można przez sprawdzenie, czy właściwość level zawiera wartość "error" w funkcji modułu obsługi zdarzenia.

Praca ze zdarzeniami błędu

Klasa ErrorEvent o raz jej podklasy zawierają typy błędów do obsługi błędów wywoływanych przez środowisko wykonawcze Flash podczas odczytu lub zapisu danych.

W poniższym przykładzie użyta została instrukcja try..catch oraz moduły obsługi zdarzeń błędu do wyświetlania błędów wykrytych podczas próby odczytu lokalnego pliku. Bardziej wyrafinowany kod obsługi w celu zapewnienia użytkownikowi opcji wyboru lub innej automatycznej obsługi błędu można dodać w miejscu wskazywanym przez komentarz “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 
        } 
    } 
}

Praca ze zdarzeniami zmiany statusu

W trakcie wykonywania aplikacji środowiska wykonawcze Flash dynamicznie zmieniają wartość właściwości netStatus.info.level lub status.level klas obsługujących właściwość level . Klasami, które zawierają właściwość netStatus.info.level , są klasy NetConnection, NetStream i SharedObject. Klasami, które zawierają właściwość status.level są klasy HTTPStatusEvent, Camera, Microphone i LocalConnection. Można napisać funkcję modułu obsługi w celu reakcji na zmianę wartości właściwości level i śledzenia błędów komunikacji.

Poniższy przykład używa funkcji netStatusHandler() do testowania wartości właściwości level . Jeśli właściwość level wskazuje, że napotkany został błąd, wyświetlony zostanie komunikat o niepowodzeniu przesyłania strumieniowego wideo.

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