web-dev-qa-db-fra.com

Comment attraper toutes les exceptions dans Flex?

Lorsque j'exécute une application Flex dans le lecteur flash de débogage, une exception s'affiche dès que quelque chose d'inattendu s'est produit. Cependant, lorsqu'un client utilise l'application, il n'utilise pas le lecteur flash de débogage. Dans ce cas, il n'obtient pas de pop-up d'exception, mais l'interface utilisateur ne fonctionne pas.

Donc, pour des raisons de prise en charge, je voudrais attraper toute exception qui peut se produire n'importe où dans l'interface utilisateur Flex et présenter un message d'erreur dans une fenêtre contextuelle interne Flex. En utilisant Java, je voudrais simplement encapsuler tout le code de l'interface utilisateur dans un bloc try/catch, mais avec les applications MXML dans Flex, je ne sais pas, où je pourrais effectuer un essai/capture aussi général.

43
Yaba

Il n'y a aucun moyen d'être notifié des exceptions non interceptées dans Flex 3. Adobe est conscient du problème mais je ne sais pas s'ils prévoient de créer une solution de contournement.

La seule solution en l'état est de mettre try/catch dans des endroits logiques et de vous assurer que vous écoutez l'événement ERROR (ou FAULT pour les services web) pour tout ce qui les distribue.

Edit: De plus, il est en fait impossible de détecter une erreur lancée par un gestionnaire d'événements. J'ai enregistré un bug sur le système de bogues Adobe.

Mise à jour 2010-01-12: La gestion globale des erreurs est désormais prise en charge dans Flash 10.1 et AIR 2. = (tous deux en version bêta), et est obtenu en souscrivant à l'événement NCAUGHT_ERROR de LoaderInfo.uncaughtErrorEvents . Le code suivant est extrait de exemple de code sur liveocs :

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
        }
    }
52
Richard Szalay

Il y a une demande de bogue/fonctionnalité pour cela dans le système de gestion des bogues d'Adobe. Votez pour cela si c'est important pour vous.

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

9
Samuel Crank

Cela fonctionne dans Flex 3.3.

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

J'utilise flex 4. J'ai essayé loaderInfo.UncaughtErrorEvents, mais loaderInfo n'a pas été initialisé donc il m'a donné une erreur de référence nulle. Puis j'ai essayé root.loaderInfo.UncaughtErrorEvents et la même histoire. J'ai essayé Sprite.root.UncaughtErrorEvents, mais il n'y avait pas d'objet Sprite, j'en ai créé un, mais cela n'a pas fonctionné. Enfin j'ai essayé

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

Et devinez quoi, cela fonctionne comme par magie. vérifier ceci

3
Rose

Alternative à la réponse acceptée, utilisant try-catch. Plus lent, mais plus simple à lire, je pense.

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

Bien sûr, vous devrez utiliser un playerglobal.swc 10.1 à jour pour compiler ce code avec succès: http://labs.Adobe.com/downloads/flashplayer10.html

3
aaaidan

Cela fonctionne dans Flex 3.5 et 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>

Merci

3
Jefferson

Notez que le bogue FP-444 (ci-dessus) renvoie à http://labs.Adobe.com/technologies/flashplayer10/features.html#developer qui depuis octobre 2009 montre que cela sera possible à partir de la version 10.1 , qui actuellement, le 28 octobre 2009 est toujours inédit - donc je suppose que nous verrons si cela est vrai quand il sera publié

3
Peter V. Mørch

J'ai attaché l'écouteur d'événements à la `` racine '', ce qui a fonctionné pour moi:

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

Dans le débogage de Flash Player, cela restera une erreur, mais dans la version sans débogage, l'erreur apparaîtra dans la boîte de dialogue de Flash Player - puis le gestionnaire répondra. Pour empêcher la boîte de dialogue d'apparaître, ajoutez:

event.preventDefault();

alors:

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

J'utilisais cela dans AIR, mais je suppose que cela fonctionne également pour les projets AS3 standard.

2
neave

Maintenant, vous pouvez, en utilisant les informations du chargeur:

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

Récupération: loaderInfo.uncaughtErrorEvents.addEventListener (UncaughtErrorEvent.UNCAUGHT_ERROR, onUncaughtError);

private function onUncaughtError(e:UncaughtErrorEvent):void
{
    // Do something with your error.
}
0
Pablo