Respuesta al estado y a los eventos de error

Flash Player 9 y posterior, Adobe AIR 1.0 y posterior

Una de las mejoras más evidentes en la gestión de errores de ActionScript 3.0 es la compatibilidad con la gestión de eventos de error, que permite responder a errores asincrónicos mientras se ejecuta una aplicación. (Para obtener una definición de errores asincrónicos, consulte Tipos de errores .)

Se pueden crear detectores y controladores de eventos para responder a los eventos de error. Muchas clases distribuyen eventos de error igual que otros eventos. Por ejemplo, una instancia de la clase XMLSocket suele distribuir tres tipos de eventos: Event.CLOSE , Event.CONNECT y DataEvent.DATA . No obstante, cuando se produce un problema, la clase XMLSocket puede distribuir los errores IOErrorEvent.IOError o SecurityErrorEvent.SECURITY_ERROR . Para obtener más información sobre detectores y controladores de eventos, consulte Gestión de eventos .

Los eventos de error se enmarcan en una de estas dos categorías:

  • Eventos de error que amplían la clase ErrorEvent

    La clase flash.events.ErrorEvent contiene las propiedades y los métodos para gestionar los errores relacionados con las operaciones de red y comunicaciones en una aplicación en ejecución. Las clases AsyncErrorEvent, IOErrorEvent y SecurityErrorEvent amplían la clase ErrorEvent. Si se usa la versión de depuración de un motor de ejecución de Flash, un cuadro de diálogo indicará en tiempo de ejecución los eventos de error que encuentre el reproductor sin las funciones de detección.

  • Eventos de error basados en estado

    Los eventos de error basados en estado hacen referencia a las propiedades netStatus y status de las clases de red y comunicaciones. Si el motor de ejecución de Flash detecta un problema al leer o escribir datos, el valor de las propiedades netStatus.info.level o status.level (según el objeto de clase que se utilice) se establece en "error" . A este error se responde comprobando si la propiedad level contiene el valor "error" en la función de controlador de eventos.

Trabajo con eventos de error

La clase ErrorEvent y sus subclases contienen tipos de error para gestionar errores distribuidos por los motores de ejecución de Flash cuando intentan leer o escribir datos.

En el siguiente ejemplo se utiliza una sentencia try..catch y controladores de eventos de error para mostrar todos los errores detectados al intentar leer un archivo local. Se puede añadir código de gestión más avanzado a fin de proporcionar opciones a los usuarios o bien gestionar el error automáticamente en los lugares indicados con el comentario "escribir código de gestión de errores aquí":

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

Trabajo con eventos de cambio de estado

Los motores de ejecución de Flash cambian dinámicamente el valor de las propiedades netStatus.info.level o status.level para las clases que admiten la propiedad level mientras se ejecuta una aplicación. Las clases que tienen la propiedad netStatus.info.level son NetConnection, NetStream y SharedObject. Las clases que tienen la propiedad status.level son HTTPStatusEvent, Camera, Microphone y LocalConnection. Se puede escribir una función de controlador para responder al cambio del valor level y hacer un seguimiento de los errores de comunicación.

En el siguiente ejemplo se usa una función netStatusHandler() para probar el valor de la propiedad level . Si la propiedad level indica que se ha detectado un error, el código realiza un seguimiento del mensaje "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); 
        } 
    } 
}