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.

¿Fue útil?

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.

http://bugs.adobe.com/jira/browse/FP-444

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.
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top