Svara på felhändelser och status

Flash Player 9 och senare, Adobe AIR 1.0 och senare

En av de mest märkbara förbättringarna när det gäller felhantering i ActionScript 3.0 är stödet för felhändelsehantering för att svara på asynkrona fel som inträffar när ett program körs. (En definition av asynkrona fel finns i Olika typer av fel.)

Du kan skapa händelseavlyssnare och händelsehanterare för att besvara felhändelser. I många klasser skickas felhändelser på samma sätt som andra händelser. En instans av exempelvis klassen XMLSocket skickar normalt tre typer av händelser: Event.CLOSE, Event.CONNECT och DataEvent.DATA. Om emellertid ett problem inträffar kan klassen XMLSocket skicka IOErrorEvent.IOError eller SecurityErrorEvent.SECURITY_ERROR. Mer information om händelseavlyssnare och händelsehanterare finns i Hantera händelser.

Felhändelser passar in i en av dessa två kategorier:

  • Felhändelser som utökar klassen ErrorEvent

    Klassen flash.events.ErrorEvent innehåller egenskaper och metoder för att hantera fel som rör nätverks- och kommunikationsåtgärder i ett program som körs. Klasserna AsyncErrorEvent, IOErrorEvent och SecurityErrorEvent utökar klassen ErrorEvent. Om du använder felsökningsversionen av en Flash-miljö öppnas en dialogruta under körningen som informerar dig om felhändelser, utan avlyssnarfunktioner, som identifieras av spelaren.

  • Statusbaserade felhändelser

    Statusbaserade felhändelser är relaterade till egenskaperna netStatus och status i nätverks- och kommunikationsklasserna. Om en Flash-miljö stöter på ett problem när data läses eller skrivs anges värdet för egenskapen netStatus.info.level eller status.level (beroende på vilket klassobjekt du använder) till error. Du besvarar detta fel genom att kontrollera om egenskapen level innehåller värdet "error" i din händelsehanterarfunktion.

Arbeta med felhändelser

Klassen ErrorEvent och dess underklasser innehåller feltyper för hantering av fel som skickas av Flash-miljön vid skriv- och läsåtgärder.

I följande exempel används både en try..catch-sats och felhändelsehanterare för att visa fel som upptäcks när ett försök görs att läsa en lokal fil. Du kan på de platser som markeras med kommentaren ”your error handling code here” lägga till en mer sofistikerad kod för att ge användarna flera alternativ eller möjlighet att välja att hantera felet automatiskt:

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

Arbeta med statusförändringshändelser

Flash-miljöer ändrar värdet på egenskapen netStatus.info.level eller status.level dynamiskt för de klasser som har stöd för egenskapen level när ett program körs. Klasser med egenskapen netStatus.info.level är NetConnection, NetStream och SharedObject. De klasser som innehåller egenskapen status.level är HTTPStatusEvent, Camera, Microphone och LocalConnection. Du kan skriva en hanterarfunktion för att besvara ändringar i level-värdet och för att spåra kommunikationsfel.

I följande exempel används funktionen netStatusHandler() för att testa värdet för egenskapen level. Om egenskapen level indikerar att ett fel har inträffat kommer meddelandet ”Video stream failed” att spåras av koden.

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