590 votes

Comment puis-je obtenir une trace de pile Javascript quand je lance une exception?

Si je jette un Javascript à l'exception de moi-même (par exemple, throw "AArrggg"), comment puis-je obtenir la trace de la pile (dans Firebug ou autre)? Maintenant je viens de recevoir le message.

edit: Comme beaucoup de personnes ci-dessous ont publié, il est possible d'obtenir une trace de la pile pour une exception JavaScript mais je veux obtenir une trace de la pile pour mon exceptions. Par exemple:

function foo() {
    bar(2);
}
function bar(n) {
    if (n < 2)
        throw "Oh no! 'n' is too small!"
    bar(n-1);
}

Lors de l' foo est appelé, je veux obtenir une trace de la pile qui comprend les appels à l' foo, bar, bar.

866voto

Eugene Morozov Points 4417

Une version modifiée de cet extrait peut un peu aider:

function stacktrace() { 
  function st2(f) {
    return !f ? [] : 
        st2(f.caller).concat([f.toString().split('(')[0].substring(9) + '(' + f.arguments.join(',') + ')']);
  }
  return st2(arguments.callee.caller);
}


EDIT :

Une meilleure (et plus simple) de la solution comme l'a souligné dans les commentaires sur la question de départ est d'utiliser l' stack de la propriété de l' Error objet comme ceci:

function stackTrace() {
    var err = new Error();
    return err.stack;
}

Cela va générer un résultat comme ceci:

DBX.Utils.stackTrace@http://localhost:49573/assets/js/scripts.js:44
DBX.Console.Debug@http://localhost:49573/assets/js/scripts.js:9
.success@http://localhost:49573/:462
x.Callbacks/c@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
x.Callbacks/p.fireWith@http://localhost:49573/assets/js/jquery-1.10.2.min.js:4
k@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6
.send/r@http://localhost:49573/assets/js/jquery-1.10.2.min.js:6

En donnant le nom de la fonction d'appel de l'URL, de sa fonction d'appel, et ainsi de suite.

204voto

Jocelyn delalande Points 852

Notez que chromium / chrome (d'autres navigateurs utilisant V8) ont une interface pratique pour obtenir une trace de pile via une propriété de pile sur les objets Error .

 try {
   // Code throwing an exception
} catch(e) {
  console.log(e.stack);
}
 

Il s'applique pour les exceptions de base ainsi que pour celles que vous vous jetez. (Considérant que vous utilisez la classe Error, ce qui est de toute façon une bonne pratique).

Voir les détails sur la documentation V8

84voto

Justin L. Points 1427

Dans Firefox, il semble que vous n'avez pas besoin de lancer l'exception. C'est suffisant de faire

 e = new Error();
console.log(e.stack);
 

25voto

Helephant Points 4085

Si vous avez firebug, il y a une option break sur toutes les erreurs dans l'onglet script. Une fois que le script a atteint votre point d'arrêt, vous pouvez regarder la fenêtre de la pile de firebug: texte alt

10voto

Mark Biek Points 41769

Je ne pense pas qu'il y ait quelque chose de construit que vous pouvez utiliser, mais j'ai trouvé beaucoup d'exemples de personnes qui roulent le leur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X