Risposte a eventi errore e a errori basati sullo stato

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Uno dei miglioramenti più evidenti apportati alla funzionalità di gestione degli errori in ActionScript 3.0 è rappresentato dal supporto della gestione degli errori asincroni quando un'applicazione è in esecuzione. Per una definizione di errori asincroni, vedete Tipi di errore.

Per rispondere agli eventi errore si possono creare listener e gestori di eventi. Molte classi inviano gli eventi errore esattamente come qualsiasi altro tipo di evento. Ad esempio, un'istanza della classe XMLSocket generalmente invia tre tipi di eventi: Event.CLOSE, Event.CONNECT e DataEvent.DATA. Tuttavia, quando si verifica un problema, la classe XMLSocket può inviare l'errore IOErrorEvent.IOError o l'errore SecurityErrorEvent.SECURITY_ERROR. Per ulteriori informazioni sui listener e gestori di eventi, vedete Gestione degli eventi.

Gli eventi errore appartengono a due categorie:

  • Eventi errore che ampliano la classe ErrorEvent

    La classe flash.events.ErrorEvent contiene le proprietà e i metodi per la gestione degli errori relativi alle attività di rete e di comunicazione in un'applicazione in esecuzione. Le classi AsyncErrorEvent, IOErrorEvent e SecurityErrorEvent sono evoluzioni della classe ErrorEvent. Quando utilizzate la versione debugger di un runtime Flash, una finestra di dialogo comunica, in fase di runtime, gli eventi errore senza funzione di listener che il programma incontra.

  • Eventi errore basati sullo stato

    Gli eventi errore basati sullo stato sono correlati alle proprietà netStatus e status delle classi di rete e comunicazione. Se un runtime Flash incontra un problema durante la lettura o scrittura dei dati, il valore della proprietà netStatus.info.level o status.level (a seconda della classe utilizzata) viene impostato su "error". Si risponde a questo errore verificando se la proprietà level contiene il valore "error" nella funzione gestore di eventi.

Operazioni con gli eventi errore

La classe ErrorEvent e le relative sottoclassi contengono tipi di errore che i runtime Flash inviano mentre tentano di leggere o scrivere dati.

L'esempio seguente utilizza un'istruzione try..catch e gestori errore per visualizzare gli eventuali errori rilevati quando si cerca di leggere un file locale. Per presentare agli utenti più opzioni, è possibile creare codice di gestione più sofisticato oppure gestire l'errore automaticamente nei punti indicati dal commento “inserite qui il codice di gestione degli errori”:

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

Operazioni con gli eventi di variazione dello stato

I runtime Flash variano in modo dinamico il valore della proprietà netStatus.info.level o della proprietà status.level per le classi che supportano la proprietà level quando un'applicazione è in esecuzione. Le classi dotate della proprietà netStatus.info.level sono NetConnection, NetStream e SharedObject. Le classi dotate della proprietà status.level sono HTTPStatusEvent, Camera, Microphone e LocalConnection. Tramite una funzione gestore si può rispondere alla modifica del valore level e tenere traccia degli errori di comunicazione.

L'esempio seguente illustra l'utilizzo di una funzione netStatusHandler() per verificare il valore della proprietà level. Se la proprietà level indica che si è verificato un errore, il codice produce il messaggio “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); 
        } 
    } 
}