Réponse à des événements et à l’état d’erreur

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

L’une des améliorations majeures apportées à la gestion des erreurs dans ActionScript 3.0 est la prise en charge de la gestion des événements d’erreur pour répondre à des erreurs asynchrones lors de l’exécution d’une application. (Pour obtenir une définition des erreurs asynchrones, voir Types d’erreurs).

Vous pouvez créer des écouteurs d’événement et des gestionnaires d’événements pour répondre aux événements d’erreurs. De nombreuses classes distribuent des événements d’erreurs de la même façon que d’autres événements. Par exemple, une occurrence de la classe XMLSocket distribue normalement trois types d’événements :Event.CLOSE, Event.CONNECT et DataEvent.DATA. Néanmoins, lorsqu’un problème se produit, la classe XMLSocket peut distribuer IOErrorEvent.IOError ou SecurityErrorEvent.SECURITY_ERROR. Pour plus d’informations sur les écouteurs et les gestionnaires d’événement, voir Gestion des événements.

Les événements d’erreurs peuvent être classés en deux catégories :

  • Evénements d’erreurs qui étendent la classe ErrorEvent

    La classe flash.events.ErrorEvent contient les propriétés et les méthodes permettant de gérer les erreurs d’exécution liées à des opérations de réseau et de communication dans une application en cours d’exécution. Les classes AsyncErrorEvent, IOErrorEvent et SecurityErrorEvent étendent la classe ErrorEvent. Si vous utilisez la version de débogage d’un moteur d’exécution de Flash, une boîte de dialogue vous informe, lors de l’exécution, de la présence d’événements d’erreurs sans fonctions d’écouteur rencontrés par le lecteur.

  • Evénements d’erreurs basés sur le statut

    Les événements d’erreur basés sur le statut sont liés aux propriétés netStatus et status des classes de communication et de réseau. Si un moteur d’exécution Flash rencontre un problème lors de la lecture ou de l’écriture des données, la valeur des propriétés netStatus.info.level ou status.level (selon l’objet de classe que vous utilisez) est définie sur la valeur "error". Vous répondez à cette erreur en vérifiant que la propriété level contient la valeur "error" dans votre fonction de gestionnaire d’événement.

Utilisation d’événements d’erreurs

La classe ErrorEvent et ses sous-classes contiennent des types d’erreurs destinés à gérer les erreurs distribuées par les moteurs d’exécution Flash lorsqu’ils tentent de lire ou d’écrire des données.

L’exemple suivant utilise à la fois une instruction try..catch et des gestionnaires d’événement d’erreur pour afficher toute erreur détectée lors de la tentative de lecture d’un fichier local. Vous pouvez ajouter un code de gestion plus élaboré pour proposer des options à l’utilisateur ou gérer l’erreur automatiquement aux endroits indiqués par le commentaire « 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 
        } 
    } 
}

Utilisation d’événements de changement de statut

Les moteurs d’exécution Flash changent dynamiquement la valeur des propriétés netStatus.info.level ou status.level pour les classes qui prennent en charge la propriété level pendant qu’une application s’exécute. Les classes qui ont la propriété netStatus.info.level sont NetConnection, NetStream et SharedObject. Les classes qui ont la propriété status.level sont HTTPStatusEvent, Camera, Microphone et LocalConnection. Vous pouvez écrire une fonction de gestionnaire pour répondre au changement de valeur level et suivre les erreurs de communication.

L’exemple suivant utilise une fonction netStatusHandler() pour tester la valeur de la propriété level. Si la propriété level indique qu’une erreur a été rencontrée, le code suit le message « 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); 
        } 
    } 
}