Cómo capturar todas las excepciones en Flex?
-
01-07-2019 - |
Pregunta
Cuando ejecuto una aplicación Flex en el reproductor de depuración de flash puedo obtener una excepción pop-up tan pronto como ocurrió algo inesperado.Sin embargo, cuando un cliente utiliza la aplicación no utiliza el reproductor de depuración de flash.En este caso no es una excepción pop-up, pero él interfaz de usuario no está funcionando.
Así, por razones de compatibilidad, me gustaría capturar cualquier excepción que puede suceder en cualquier lugar del Flex de interfaz de usuario y presentar un mensaje de error en un Flex interno emergente.Mediante el uso de Java me acaba de encapsular toda la interfaz de usuario código en un bloque try/catch, pero con MXML aplicaciones en Flex no sé, donde podría realizar un general try/catch.
Solución
No hay ninguna manera para ser notificados en uncaught excepciones en Flex 3.Adobe son conscientes del problema, pero no sé si se va a crear una solución.
La única solución, tal y como está es poner try/catch en la lógica de los lugares y asegúrese de que usted está escuchando el ERROR (o la CULPA de webservices) para cualquier cosa que se envía.
Editar: Además, es realmente imposible coger un error arrojado desde un controlador de eventos.He iniciado un error en el Adobe Error del Sistema.
Actualización 2010-01-12: Tratamiento de errores Global es ahora soportado en Flash 10.1 y AIR 2.0 (tanto en la versión beta), y se logra mediante la suscripción de la UNCAUGHT_ERROR evento de LoaderInfo.uncaughtErrorEvents.El código siguiente es tomado de la ejemplo de código en livedocs:
public class UncaughtErrorEventExample extends Sprite
{
public function UncaughtErrorEventExample()
{
loaderInfo.uncaughtErrorEvents.addEventListener(
UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
}
private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
if (event.error is Error)
{
var error:Error = event.error as Error;
// do something with the error
}
else if (event.error is ErrorEvent)
{
var errorEvent:ErrorEvent = event.error as ErrorEvent;
// do something with the error
}
else
{
// a non-Error, non-ErrorEvent type was thrown and uncaught
}
}
Otros consejos
Hay un error/función de solicitud para este en el Adobe de gestión de errores del sistema.Voto por que si es importante para usted.
Funciona en Flex 3.3.
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
}
Nota que el fallo de la FP-444 (arriba) enlaces a http://labs.adobe.com/technologies/flashplayer10/features.html#developer que desde Octubre de 2009 muestra que esto será posible a partir de la versión 10.1, que en la actualidad, 28 de Octubre de 2009, es todavía inéditos - así que creo que vamos a ver si eso es cierto cuando se libera
Alternativa aceptada respuesta, el uso de try-catch.Más lento, pero más sencillo de leer, creo.
try {
loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError);
} catch (e:ReferenceError) {
var spl:Array = Capabilities.version.split(" ");
var verSpl:Array = spl[1].split(",");
if (int(verSpl[0]) >= 10 &&
int(verSpl[1]) >= 1) {
// This version is 10.1 or greater - we should have been able to listen for uncaught errors...
d.warn("Unable to listen for uncaught error events, despite flash version: " + Capabilities.version);
}
}
Por supuesto, usted necesitará utilizar un up-to-fecha de 10.1 playerglobal.swc con el fin de compilar este código correctamente:http://labs.adobe.com/downloads/flashplayer10.html
Estoy usando flex 4.He intentado loaderInfo.UncaughtErrorEvents,
pero loaderInfo no fue inicializada por lo que me dio una referencia nula de error.Entonces traté de root.loaderInfo.UncaughtErrorEvents
y la misma historia.He intentado sprite.root.UncaughtErrorEvents
, pero no había ningún objeto sprite, he creado uno, pero no funcionó.Por último he intentado
systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);
Y adivinen qué, no funciona como magia.verificación este
Funciona en Flex 3.5 y flash player 10:
<?xml version="1.0" encoding="utf-8"?>
protected function application1_addedToStageHandler(event:Event):void{
if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
}
sdk.text = "Flex " + mx_internal::VERSION;
}
private function uncaughtErrorHandler(e:*):void{
e.preventDefault();
var s:String;
if (e.error is Error)
{
var error:Error = e.error as Error;
s = "Uncaught Error: " + error.errorID + ", " + error.name + ", " + error.message;
}
else
{
var errorEvent:ErrorEvent = e.error as ErrorEvent;
s = "Uncaught ErrorEvent: " + errorEvent.text;
}
msg.text = s;
}
private function unCaught():void
{
var foo:String = null;
trace(foo.length);
}
]]>
</mx:Script>
<mx:VBox>
<mx:Label id="sdk" fontSize="18"/>
<mx:Button y="50" label="UnCaught Error" click="unCaught();" />
<mx:TextArea id="msg" width="180" height="70"/>
</mx:VBox>
Gracias
Os adjunto el detector de eventos para la 'raíz', que ha trabajado para mí:
sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
En el Reproductor de depuración de Flash, esto error, pero en la no depuración de versión aparecerá el error en el Flash Player en el cuadro de diálogo y, a continuación, el controlador responderá.Para detener el cuadro de diálogo que aparece, agregar:
event.preventDefault();
así:
private function onUncaughtError(event:UncaughtErrorEvent):void
{
event.preventDefault();
// do something with this error
}
Yo estaba usando este en el AIRE, pero supongo que funciona para el estándar AS3 proyectos también.
Ahora usted puede, usando el gestor de info:
http://www.adobe.com/devnet/flex/articles/global-exception-handling.html
Checkout:loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);
private function onUncaughtError(e:UncaughtErrorEvent):void
{
// Do something with your error.
}