Frage

Wenn ich eine Flex-Anwendung im Debug Flash Player laufen bekomme ich eine Ausnahme, sobald etwas Unerwartetes auftauchen. Allerdings, wenn ein Kunde die Anwendung nutzt er verwendet nicht den Debug Flash Player. In diesem Fall wird er nicht eine Ausnahme Pop-up bekommt, aber er UI funktioniert nicht.

Also für Wartbarkeit Gründe würde Ich mag jede Ausnahme fangen, die überall in dem Flex-UI passieren können, und präsentieren eine Fehlermeldung in einem Flex-internen Popup. Durch die Verwendung von Java würde ich kapseln nur die gesamte UI-Code in einen try / catch-Block, aber mit MXML-Anwendungen in Flex Ich weiß nicht, wo ich könnte eine solche allgemeine try / catch durchführen.

War es hilfreich?

Lösung

Es gibt keine Möglichkeit auf abgefangene Ausnahmen in Flex 3. Adobe sind sich bewusst über das Problem informiert werden, aber ich weiß nicht, ob sie sich auf die Schaffung einer Abhilfe zu planen.

Die einzige Lösung, wie es steht setzen try / catch in logischen Orten und stellen Sie sicher, um den Fehler (oder einen Fehler für eine Web Service) Ereignis für alles hören, die sie entsendet.

Edit: Darüber hinaus ist es eigentlich unmöglich, einen Fehler von einem Event-Handler geworfen zu fangen. Ich habe einen Fehler auf dem Adobe-Bug-System angemeldet.

Aktualisieren 2010-01-12: Globale Fehlerbehandlung wird nun in unterstützt Flash 10.1 und AIR 2.0 (beide in der beta), und wird erreicht, indem die Anmeldung UNCAUGHT_ERROR Fall LoaderInfo.uncaughtErrorEvents . Der folgende Code wird aus dem genommen Codebeispiel auf 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
        }
    }

Andere Tipps

Es gibt einen Bug / Feature-Request für diesen in dem Managementsystem Adobe Bug. Stimmen Sie für es, wenn es Ihnen wichtig ist.

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

Es funktioniert in Flex 3.3.

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

Beachten Sie, dass Fehler FP-444 (siehe oben) Links zu http: // labs.adobe.com/technologies/flashplayer10/features.html#developer , dass 2009 seit Oktober zeigt, dass dies von 10.1 möglich sein wird, die derzeit, 28. Oktober 2009 noch nicht freigegebenen ist - so denke ich, dass wir sehen, ob das wahr ist, wenn sie veröffentlicht wird

Alternative zu akzeptierte Antwort, mit try-catch. Langsamer, aber einfacher zu lesen, denke ich.

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

Natürlich müssen Sie einen up-to-date 10.1 playerglobal.swc, um diesen Code zu kompilieren, erfolgreich werden: http://labs.adobe.com/downloads/flashplayer10.html

Ich verwende Flex 4. Ich habe versucht, loaderInfo.UncaughtErrorEvents, aber loader wurde nicht initialisiert, so dass es mir null Referenzfehler gab. Dann habe ich versucht root.loaderInfo.UncaughtErrorEvents und die gleiche Geschichte. Ich habe versucht, sprite.root.UncaughtErrorEvents, aber es gab keine Sprite-Objekt, habe ich ein, aber es hat nicht funktioniert. Schließlich habe ich versucht,

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

Und erraten, was es wie Magie funktioniert. überprüfen dieser

Es funktioniert in Flex 3.5 und 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>

Danke

Ich legte die Ereignis-Listener an die ‚Wurzel‘, die für mich gearbeitet:

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

Im Debug Flash Player wird dies immer noch Fehler, aber in der nicht-Debug-Version wird der Fehler in Flash Player das Dialogfeld angezeigt werden - und dann wird der Handler reagieren. Um das Dialogfeld angezeigt zu stoppen, hinzufügen:

event.preventDefault();

so:

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

Ich war mit diesem in der Luft, aber ich nehme an, es auch für Standard-AS3 Projekte funktioniert.

Jetzt können Sie, mit Lader Info:

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

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

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top