Domanda

Quando eseguo un'applicazione Flex nel flash player di debug, viene visualizzata un'eccezione non appena accade qualcosa di inaspettato.Tuttavia, quando un cliente utilizza l'applicazione, non utilizza il flash player di debug.In questo caso non viene visualizzata alcuna eccezione, ma l'interfaccia utente non funziona.

Pertanto, per motivi di supportabilità, vorrei rilevare qualsiasi eccezione che può verificarsi in qualsiasi punto dell'interfaccia utente Flex e presentare un messaggio di errore in un popup interno Flex.Utilizzando Java incapsulerei semplicemente l'intero codice dell'interfaccia utente in un blocco try/catch, ma con le applicazioni MXML in Flex non so dove potrei eseguire un try/catch così generale.

È stato utile?

Soluzione

Non è possibile ricevere notifiche sulle eccezioni non rilevate in Flex 3.Adobe è a conoscenza del problema ma non so se ha intenzione di creare una soluzione alternativa.

L'unica soluzione così com'è è mettere try/catch in posizioni logiche e assicurarsi di ascoltare l'evento ERROR (o FAULT per i servizi web) per tutto ciò che li invia.

Modificare: Inoltre, è effettivamente impossibile rilevare un errore generato da un gestore di eventi.Ho registrato un insetto sul sistema Adobe Bug.

Aggiornamento 2010-01-12: La gestione globale degli errori è ora supportata in Flash 10.1 E ARIA 2.0 (entrambi in versione beta), e si ottiene sottoscrivendo il ERRORE_UNCAUGHT evento di LoaderInfo.uncaughtErrorEvents.Il seguente codice è tratto da esempio di codice su 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
        }
    }

Altri suggerimenti

Esiste una richiesta di bug/funzionalità per questo nel sistema di gestione dei bug di Adobe.Votalo se per te è importante.

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

Funziona con Flex 3.3.

 if(loaderInfo.hasOwnProperty("uncaughtErrorEvents")){
    IEventDispatcher(loaderInfo["uncaughtErrorEvents"]).addEventListener("uncaughtError", uncaughtErrorHandler);
 }

Tieni presente che il bug FP-444 (sopra) si collega a http://labs.adobe.com/technologies/flashplayer10/features.html#developer che dall'ottobre 2009 mostra che ciò sarà possibile a partire dalla versione 10.1, che attualmente, il 28 ottobre 2009, non è ancora stata rilasciata, quindi immagino che vedremo se sarà vero quando verrà rilasciata

Alternativa alla risposta accettata, utilizzando try-catch.Più lento, ma più semplice da leggere, credo.

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

Naturalmente, dovrai utilizzare un playerglobal.swc 10.1 aggiornato per compilare correttamente questo codice:http://labs.adobe.com/downloads/flashplayer10.html

Sto usando Flex4.ho provato loaderInfo.UncaughtErrorEvents, ma loaderInfo non è stato inizializzato, quindi mi ha dato un errore di riferimento nullo.Poi ho provato root.loaderInfo.UncaughtErrorEvents e la stessa storia.ho provato sprite.root.UncaughtErrorEvents, ma non c'era nessun oggetto sprite, ne ho creato uno, ma non ha funzionato.Alla fine ci ho provato

systemManager.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR,globalUnCaughtErrorHandler.hanleUnCaughtError);

E indovina un po', funziona come per magia.controllo Questo

Funziona con Flex 3.5 e 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>

Grazie

Ho allegato l'ascoltatore di eventi alla 'root', che ha funzionato per me:

sprite.root.loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

Nel Flash Player di debug si verificherà ancora un errore, ma nella versione non di debug l'errore verrà visualizzato nella finestra di dialogo di Flash Player e quindi il gestore risponderà.Per impedire la visualizzazione della finestra di dialogo, aggiungere:

event.preventDefault();

COSÌ:

    private function onUncaughtError(event:UncaughtErrorEvent):void
    {
        event.preventDefault();
        // do something with this error
    }

Lo stavo usando in AIR, ma presumo che funzioni anche per progetti AS3 standard.

Ora puoi, utilizzando le informazioni sul caricatore:

http://www.adobe.com/devnet/flex/articles/global-exception-handling.html

Guardare:loaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top