2010-03-31 13 views
0

J'ai bricolé du code d'ici et là pour une trace que j'aime ... ça génère une erreur pour obtenir une trace de pile et choisir le nom de la routine tracée, j'aime ce détail dans le journal de suivi.Adobe Air, l'installation empaquetée échoue avec ma routine de trace ... pourquoi?

Problème: échec dans un fichier AIR installé. Je me demande pourquoi? Je ne m'attends pas à ce qu'il fasse quoi que ce soit ... juste, je préférerais que ça ne fasse pas échouer le programme!

tx Artie

enter code here  

static public function XTRACE(... traceArgs):void { 
    try { 
     throw new Error(); // make a stack 
    } catch (e:Error) { 
     var stack:String = e.getStackTrace(); 
     var frames:Array = stack.split("\n"); 
     var myFrame:String = String(frames[2]); 
     myFrame = myFrame.replace("\t", ""); 

     // "at " can be followed by some part of the package 
     // you don't want to see. E.g., if your code is all in 
     // com.foo.bar, you can put "at com.foo.bar." so as not 
     // to crowd the display 
     myFrame = myFrame.substr("at ".length); 
     myFrame = myFrame.substring(0, myFrame.indexOf("[")); 
     var now:Date = new Date(); 
     trace(new Date().toLocaleTimeString() + ":" + myFrame + ": " + traceArgs.join(" ")); 
    } 
} 

Répondre

0

De quelle façon est votre application échoue?

1) Les routines de traçage sont destinées au débogage, donc votre trace ne fera rien dans une application installée.

2) Je ne suis pas sûr quand vous appelez cette routine, mais il semble bizarre que vous ayez une routine qui ne génère qu'une erreur. Je pense que dans ce code, le 'catch' ne sera saisi que s'il y a une erreur en lançant l'erreur. Normalement, vous essayez d'effectuer une action utile et d'attraper des erreurs lorsque quelque chose ne va pas.

+0

Le symptôme visible de l'échec de l'application est que l'écran d'ouverture apparaît vide. Aucune erreur n'est affichée ou trouvée (par exemple dans les journaux système). Lorsque les appels à XTRACE sont supprimés, le programme fonctionne correctement. Solution plus facile: lorsque tout le contenu de la routine XTRACE est mis en commentaire ... alors le programme installé ".air" fonctionne correctement. L'erreur dans XTRACE crée une trace de pile, de sorte que l'origine de la trace est connue, par ex. Global.XTRACE ("test pour les données se déplace") produit: 13:14:26: com.muchoswing.cantoyo :: ApplicationClass/handleButton(): test pour les mouvements de données –

+0

Comment les lignes out un par un et voir quelle ligne le casse – 99miles

0

Dans la fonction de trace, vous tentez d'invoquer la date(). ToLocaleTimeString() de manière statique avant qu'elle ne soit instanciée par le mot-clé nouveau. Essayez plutôt ce qui suit:

trace((new Date()).toLocaleTimeString() + ":" + myFrame + ": " + traceArgs.join(" ")); 
0

merci pour votre contribution Fergal. La fonction XTRACE fonctionne correctement avec le lecteur de débogage et échoue uniquement lors de l'exécution avec le lecteur de version. Donc, je suppose que la ligne de code que j'utilise doit associer des valeurs dans l'ordre ... Je me suis installé sur l'aide d'une fonction que je ne connaissais pas avant:

enter code here 
static public function XTRACE(... traceArgs):void { 
    if (Capabilities.isDebugger) {  

Avec cela, xtrace ne fait rien à moins qu'il exécute dans un environnement de débogage. Donc, cela fonctionne autour de la question. Je vais quand même utiliser vos parenthèses, j'aime aussi faire de l'ordre évident de l'association ;-)

+0

ajoutez vos informations supplémentaires à la question, l'avoir dans une réponse est bizarre! – grapefrukt

0

Je me rends compte que vous avez probablement vieilli et avez oublié ce qu'est le flash depuis que vous avez posé cette question. Mais, vous obtenez un NPE parce que e.getStackTrace() renvoie null dans le lecteur de version.

Un couple d'autres choses:

  1. Vous n'avez pas besoin de jeter l'erreur pour obtenir une trace de la pile; new Erreur(). getStackTrace() fonctionne correctement.
  2. Puisqu'il s'agit d'un code de débogage, et que le code appelant ne s'attend probablement pas à des erreurs, vous devriez envelopper le tout dans un catch try.
  3. Le compilateur ne résoudra pas 'at' .length, il sera donc appelé à chaque exécution. Sauf si vous êtes vraiment paranoïaque, vous pouvez simplement le coder en dur à 3.
  4. Les deux sous-chaînes peuvent être combinées en 1
  5. La variable now n'est pas utilisée.