Quelqu'un sait-il comment imprimer une trace de pile dans Node.js?
Quelqu'un sait-il comment imprimer une trace de pile dans Node.js?
Réponses:
Tout Error
objet a un stack
membre qui piège le point où il a été construit.
var stack = new Error().stack
console.log( stack )
ou plus simplement:
console.trace("Here I am!")
'util'
.
new Error().stack
, ce qui fonctionne dans les cas où vous ne souhaitez pas impliquer la console.
trace
est qu'il montre également la ligne / le contexte actuel, ce qui stack
n'est pas le cas. L'information est dans l'objet d'erreur si vous voulez créer manuellement cette ligne, je suppose.
Maintenant, il y a une fonction dédiée sur la console pour cela:
console.trace()
console.trace()
.
--stack_trace_limit=200
Comme déjà répondu, vous pouvez simplement utiliser la commande trace :
console.trace("I am here");
Cependant, si vous êtes venu à cette question en recherchant comment enregistrer la trace de pile d'une exception , vous pouvez simplement enregistrer l'objet Exception.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Il enregistrera:
Erreur: quelque chose d'inattendu s'est produit.
à main (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
à Object. (c: \ Users \ Me \ Documents \ MyApp \ app.js: 17: 1)
sur Module._compile (module.js: 460: 26)
sur Object.Module._extensions..js (module.js: 478: 10 )
à Module.load (module.js: 355: 32)
à Function.Module._load (module.js: 310: 12)
à Function.Module.runMain (module.js: 501: 10)
au démarrage (node.js : 129: 16)
sur node.js: 814: 3
Si votre version de Node.js est inférieure à 6.0.0 , la journalisation de l'objet Exception ne sera pas suffisante. Dans ce cas, il n'imprimera que:
[Erreur: quelque chose d'inattendu s'est produit.]
Pour la version Node <6, utilisez console.error(e.stack)
au lieu de console.error(e)
pour imprimer le message d'erreur plus la pile complète, comme le fait la version Node actuelle.
Remarque: si l'exception est créée sous la forme d'une chaîne throw "myException"
, il n'est pas possible de récupérer la trace de la pile et les e.stack
rendements de journalisation non définis .
Pour être en sécurité, vous pouvez utiliser
console.error(e.stack || e);
et cela fonctionnera pour les anciennes et les nouvelles versions de Node.js.
console.error(e)
N'imprimer tout dans l' e
objet, y compris e.stack
?
Pour imprimer la trace de pile de la Error
console de manière plus lisible:
console.log(ex, ex.stack.split("\n"));
Exemple de résultat:
[Error] [ 'Error',
' at repl:1:7',
' at REPLServer.self.eval (repl.js:110:21)',
' at Interface.<anonymous> (repl.js:239:12)',
' at Interface.EventEmitter.emit (events.js:95:17)',
' at Interface._onLine (readline.js:202:10)',
' at Interface._line (readline.js:531:8)',
' at Interface._ttyWrite (readline.js:760:14)',
' at ReadStream.onkeypress (readline.js:99:10)',
' at ReadStream.EventEmitter.emit (events.js:98:17)',
' at emitKey (readline.js:1095:12)' ]
Avec un module Node facilement disponible, il est possible d'obtenir des traces de pile complètes sur Node (mais avec une pénalité de performance mineure): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces-for-node-js
Essayez Error.captureStackTrace (targetObject [, constructorOpt]) .
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
La fonction a
et b
sont capturés dans la pile d'erreurs et stockés dans myObj
.
stack
propriété, vous aurez besoin d'appeler ce si le nœud> = 6: Error.captureStackTrace(error)
.
Error.captureStackTrace
apparaisse dans la trace de la pile, vous pouvez l'omettre en le passant comme constructorOpt
argument.
Pour ce que je sais, l'impression de la trace de pile complète dans nodejs n'est pas possible, vous pouvez simplement imprimer une trace de pile "partielle", vous ne pouvez pas voir d'où vous venez dans le code, juste où l'exception se produit. C'est ce que Ryan Dahl explique dans cette vidéo youtube. http://youtu.be/jo_B4LTHi3I au min 56:30 pour être précis. J'espère que cela t'aides
La réponse de @isaacs est correcte, mais si vous avez besoin d'une pile d'erreurs plus spécifique ou plus propre , vous pouvez utiliser cette fonction:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Cette fonction est directement inspirée de la console.trace
fonction dans NodeJS .
Code source: version récente ou ancienne version .
err.stack
est une réponse plus correcte.
Si vous souhaitez uniquement consigner la trace de pile de l'erreur (et non le message d'erreur), le nœud 6 et supérieur inclut automatiquement le nom et le message d'erreur dans la trace de pile, ce qui est un peu gênant si vous souhaitez effectuer une gestion d'erreur personnalisée:
console.log(error.stack.replace(error.message, ''))
Cette solution de contournement enregistrera uniquement le nom de l'erreur et la trace de la pile (afin que vous puissiez, par exemple, formater le message d'erreur et l'afficher comme vous le souhaitez ailleurs dans votre code).
L'exemple ci-dessus afficherait uniquement le nom de l'erreur suivi de la trace de pile, par exemple:
Error:
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
Au lieu de:
Error: Error: Command failed: sh ./commands/getBranchCommitCount.sh HEAD
git: 'rev-lists' is not a git command. See 'git --help'.
Did you mean this?
rev-list
at /Users/cfisher/Git/squashed/execProcess.js:6:17
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
Au cas où quelqu'un chercherait toujours ceci comme je l'étais, alors il y a un module que nous pouvons utiliser appelé "stack-trace". C'est vraiment populaire. Lien NPM
Parcourez ensuite la trace.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Ou imprimez simplement la trace:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
vous pouvez utiliser le module node-stack-trace qui est un module d'alimentation complet pour suivre les piles d'appels.
sys.puts(new Error().stack)
(après avoir ajouté le module système)