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