Question

Lorsque je lance une application Flex dans le lecteur de débogage, une exception s’affiche dès qu’un imprévu se produit. Cependant, lorsqu'un client utilise l'application, il n'utilise pas le lecteur de débogage. Dans ce cas, aucune exception ne s’affiche, mais l’interface utilisateur ne fonctionne pas.

Par conséquent, pour des raisons de facilité de prise en charge, je voudrais intercepter toute exception pouvant se produire n'importe où dans l'interface utilisateur Flex et présenter un message d'erreur dans une fenêtre contextuelle interne de 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 de Flex, je ne sais pas où je pourrais effectuer un test / catch général.

Était-ce utile?

La solution

Il n’existe aucun moyen d’être informé des exceptions non interceptées dans Flex 3. Adobe est conscient du problème mais je ne sais pas s’il envisage de créer une solution de contournement.

La seule solution actuelle consiste à mettre try / catch à des endroits logiques et à vous assurer que vous écoutez l'événement ERROR (ou FAULT for webservices) pour tout ce qui les distribue.

Modifier: Par ailleurs, il est en réalité impossible de détecter une erreur générée par un gestionnaire d'événements. J'ai enregistré un bogue sur Adobe Bug System.

Mise à jour 2010-01-12: La gestion des erreurs globales est désormais prise en charge dans . Flash 10.1 et AIR 2.0 (tous deux en version bêta), et sont obtenus en souscrivant au UNCAUGHT_ERROR événement de LoaderInfo.uncaughtErrorEvents . Le code suivant provient de la Échantillon de code sur Lamedoc :

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

Autres conseils

Il existe une demande de bogue / fonctionnalité à ce sujet dans le système de gestion des bogues Adobe. Votez pour cela si c'est important pour vous.

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

Cela fonctionne dans Flex 3.3.

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

Notez que le bogue FP-444 (ci-dessus) renvoie au http: //. labs.adobe.com/technologies/flashplayer10/features.html#developer que depuis octobre 2009 montre que cela sera possible à partir de 10.1, date à laquelle le 28 octobre 2009 n'a pas encore été publiée. voir si cela est vrai quand il est publié

Alternative à la réponse acceptée, en 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 fichier 10.1 playerglobal.swc à jour pour pouvoir compiler ce code avec succès: http://labs.adobe.com/downloads/flashplayer10.html

J'utilise flex 4. J'ai essayé loaderInfo.UncaughtErrorEvents, mais loaderInfo n'étant pas initialisé, l'erreur de référence est nulle. Ensuite, 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, ça marche comme par magie. vérifiez ceci

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

J'ai associé l'écouteur d'événement à la "racine", ce qui a fonctionné pour moi:

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

Dans le lecteur de débogage, cela provoquera toujours une erreur, mais dans la version non-débogage, l'erreur apparaîtra dans la boîte de dialogue de Flash Player - et le gestionnaire répondra. Pour empêcher la boîte de dialogue de s'afficher, 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.

Maintenant, vous pouvez utiliser les informations du chargeur:

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.
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top