Si je lance moi-même une exception JavaScript (par exemple throw "AArrggg"
), comment puis-je obtenir la trace de la pile (dans Firebug ou autre)? En ce moment, je reçois juste le message.
edit : Comme beaucoup de personnes ci-dessous l'ont posté, il est possible d'obtenir une trace de pile pour une exception JavaScript mais je veux obtenir une trace de pile pour mes exceptions. Par exemple:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Quand foo
on appelle, je veux obtenir une trace de pile qui comprend les appels foo
, bar
, bar
.
javascript
stack-trace
David Wolever
la source
la source
throw 'arrrgh';
, et elles semblent les mêmes qu'avecthrow new Error('arrrgh');
.throw new Error('arrrgh');
Cependant, le débogueur Chrome a toujours besoin d' être indiqué (mais Chrome semble donner des traces beaucoup plus détaillées).Réponses:
Édition 2 (2017):
Dans tous les navigateurs modernes, vous pouvez simplement appeler:
console.trace();
(Référence MDN)Édition 1 (2013):
Une meilleure solution (et plus simple) comme indiqué dans les commentaires sur la question d'origine est d'utiliser la
stack
propriété d'unError
objet comme ceci:Cela générera une sortie comme celle-ci:
Donner le nom de la fonction appelante avec l'URL, sa fonction appelante, etc.
Original (2009):
Une version modifiée de cet extrait peut quelque peu aider:
la source
caller
est désormais obsolète etcallee
supprimé du mode strict ES5. Voici pourquoi stackoverflow.com/questions/103598/…Notez que chrome / chrome (les autres navigateurs utilisant V8), ainsi que Firefox ont une interface pratique pour obtenir une trace de pile via une propriété de pile sur les objets Error .
Il s'applique aux exceptions de base ainsi qu'à celles que vous vous lancez. (Considéré que vous utilisez la classe Error, ce qui est de toute façon une bonne pratique).
Voir les détails sur la documentation V8
la source
.stack
propriété.console.error(e.stack);
pour qu'il ressemble à un message d'exception par défautDans Firefox, il semble que vous n'ayez pas besoin de lever l'exception. Il suffit de faire
la source
window.onerror
, il montre une pile presque vide avec uniquement laonerror
fonction.console.log(new Error().stack)
> :( > :(> :(Si vous avez un firebug, il y a une option 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 pile de firebug:
la source
Une bonne (et simple) solution comme indiqué dans les commentaires sur la question d'origine est d'utiliser la
stack
propriété d'unError
objet comme ceci:Cela générera une sortie comme celle-ci:
Donner le nom de la fonction appelante avec l'URL et le numéro de ligne, sa fonction appelante, etc.
J'ai une solution vraiment élaborée et jolie que j'ai conçue pour un projet sur lequel je travaille actuellement et je l'ai extraite et retravaillée un peu pour être généralisée. C'est ici:
Découvrez-le sur GitHub (actuellement v1.2)! Vous pouvez l'utiliser comme
Console.debug("Whatever");
et ilConsole
imprimera la sortie et une trace de pile en fonction des paramètres de (ou simplement de simples informations / rien de plus). Voici un exemple:Assurez-vous de jouer avec les paramètres de l'
Console
objet! Vous pouvez ajouter un espacement entre les lignes de la trace et la désactiver complètement. Ici, il estConsole.trace
réglé surfalse
:Vous pouvez même désactiver le premier bit d'informations affiché (défini
Console.settings.debug.showInfo
surfalse
) ou désactiver complètement le débogage (définiConsole.settings.debug.enabled
surfalse
) afin de ne plus jamais avoir à commenter une instruction de débogage! Laissez-les simplement et cela ne fera rien.la source
Je ne pense pas qu'il y ait quelque chose de construit que vous puissiez utiliser, mais j'ai trouvé de nombreux exemples de personnes qui roulaient les leurs.
la source
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Vous pouvez accéder aux propriétés
stack
(stacktrace
dans Opera) d'uneError
instance même si vous l'avez lancée. La chose est, vous devez vous assurer que vous utilisezthrow new Error(string)
(n'oubliez pas le nouveau au lieu dethrow string
.Exemple:
la source
Avec le navigateur Chrome, vous pouvez utiliser la
console.trace
méthode: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectla source
Cela donnera une trace de pile (sous forme de tableau de chaînes) pour Chrome, Opera, Firefox et IE10 + modernes
Usage:
Il exclut de la pile son propre appel ainsi que le titre "Error" utilisé par Chrome et Firefox (mais pas IE).
Il ne devrait pas planter sur les anciens navigateurs mais simplement renvoyer un tableau vide. Si vous avez besoin d'une solution plus universelle, regardez stacktrace.js . Sa liste de navigateurs pris en charge est vraiment impressionnante, mais à mon avis, elle est très grande pour la petite tâche à laquelle elle est destinée: 37 Ko de texte minifié, y compris toutes les dépendances.
la source
Une mise à jour de la réponse d'Eugene: l'objet d'erreur doit être levé pour qu'IE (versions spécifiques?) Remplisse la
stack
propriété. Ce qui suit devrait fonctionner mieux que son exemple actuel et devrait éviter de revenirundefined
dans IE.Remarque 1: ce genre de chose ne doit être fait que lors du débogage et désactivé lorsqu'il est en direct, surtout s'il est appelé fréquemment. Remarque 2: Cela peut ne pas fonctionner dans tous les navigateurs, mais semble fonctionner dans FF et IE 11, ce qui convient très bien à mes besoins.
la source
une façon d'obtenir la trace réelle de la pile sur Firebug est de créer une vraie erreur comme appeler une fonction non définie:
Ou utilisez
console.error()
suivi d'unethrow
instruction carconsole.error()
affiche la trace de la pile.la source
Ce code polyfill fonctionne dans les navigateurs modernes (2017) (IE11, Opera, Chrome, FireFox, Yandex):
Autres réponses:
ne fonctionne pas dans IE 11!
Utiliser arguments.callee.caller - ne fonctionne pas en mode strict dans aucun navigateur!
la source
Dans Google Chrome (version 19.0 et ultérieure), le simple fait de lever une exception fonctionne parfaitement. Par exemple:
affichera la trace de la pile à la sortie de la console du navigateur:
J'espère que cette aide.
la source
une fonction:
cas d'utilisation:
la source
ce script montrera l'erreur
la source
la source
Un peu tard pour la fête, mais voici une autre solution qui détecte automatiquement si arguments.callee est disponible et utilise la nouvelle pile Error (). Sinon. Testé en chrome, safari et firefox.
2 variantes - stackFN (n) vous donne le nom de la fonction n loin de l'appelant immédiat, et stackArray () vous donne un tableau, stackArray () [0] étant l'appelant immédiat.
Essayez-le sur http://jsfiddle.net/qcP9y/6/
la source
Vous pouvez utiliser cette bibliothèque http://www.stacktracejs.com/ . C'est très bien
De la documentation
la source
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
est une ancienne version, la dernière version stable (correspondant à l'extrait de code) est ici:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Voici une réponse qui vous donne des performances maximales (IE 6+) et une compatibilité maximale. Compatible avec IE 6!
la source
Il est plus facile d'obtenir une trace de pile sur Firefox que sur IE mais, fondamentalement, voici ce que vous voulez faire:
Enveloppez le morceau de code "problématique" dans un bloc try / catch:
Si vous examinez le contenu de l'objet "erreur", il contient les champs suivants:
e.fileName: Le fichier / page source d'où provient le problème e.lineNumber: Le numéro de ligne dans le fichier / la page où le problème est survenu e.message: Un simple message décrivant le type d'erreur survenu e.name: Le type d'erreur qui a eu lieu, dans l'exemple ci-dessus, il doit s'agir de 'TypeError' e.stack: contient la trace de pile qui a provoqué l'exception
J'espère que cela vous aide.
la source
J'ai dû enquêter sur une récursion sans fin dans smartgwt avec IE11, donc pour approfondir, j'avais besoin d'une trace de pile. Le problème était que je ne pouvais pas utiliser la console de développement, car la reproduction était plus difficile de cette façon.
Utilisez ce qui suit dans une méthode javascript:
la source
Wow - Je ne vois pas une seule personne dans 6 ans suggérant que nous vérifions d'abord pour voir s'il
stack
est disponible avant de l'utiliser! La pire chose que vous puissiez faire dans un gestionnaire d'erreurs est de lancer une erreur en raison de l'appel à quelque chose qui n'existe pas.Comme d'autres l'ont dit, bien qu'il
stack
soit plus sûr à utiliser maintenant, il n'est pas pris en charge dans IE9 ou version antérieure.Je consigne mes erreurs inattendues et une trace de pile est assez essentielle. Pour un soutien maximal, je vérifie d'abord s'il
Error.prototype.stack
existe et s'il s'agit d'une fonction. Si c'est le cas, son utilisation est sûreerror.stack
.Edit: Il semble que puisque
stack
c'est une propriété et non une méthode, vous pouvez l'appeler en toute sécurité même sur les navigateurs plus anciens. Je suis toujours confus parce que j'étais à peu près sûr que la vérification avaitError.prototype
fonctionné pour moi auparavant et maintenant ce n'est pas le cas - donc je ne suis pas sûr de ce qui se passe.la source
L'utilisation de
console.error(e.stack)
Firefox affiche uniquement la trace de pile dans les journaux, Chrome affiche également le message. Cela peut être une mauvaise surprise si le message contient des informations vitales. Connectez-vous toujours aux deux.la source
Essayez juste
Cela fonctionne assez bien pour le chrome:
la source