Weiß jemand, wie man einen Stack-Trace in Node.js druckt?
Weiß jemand, wie man einen Stack-Trace in Node.js druckt?
Antworten:
Jedes Error
Objekt hat ein stack
Element, das den Punkt abfängt, an dem es erstellt wurde.
var stack = new Error().stack
console.log( stack )
oder einfacher:
console.trace("Here I am!")
'util'
.
new Error().stack
, was in Fällen funktioniert, in denen Sie die Konsole nicht einbeziehen möchten.
trace
ist, dass es auch die aktuelle Zeile / den aktuellen Kontext anzeigt, was stack
nicht der Fall ist. Die Informationen befinden sich im Fehlerobjekt, wenn Sie diese Zeile manuell erstellen möchten.
Jetzt gibt es eine spezielle Funktion auf der Konsole dafür:
console.trace()
console.trace()
.
--stack_trace_limit=200
Wie bereits beantwortet, können Sie einfach den Befehl trace verwenden :
console.trace("I am here");
Allerdings , wenn Sie auf diese Frage kommen Benutzer darüber , wie der Stack - Trace einer Ausnahme zu protokollieren , können Sie einfach das Exception - Objekt anmelden.
try {
// if something unexpected
throw new Error("Something unexpected has occurred.");
} catch (e) {
console.error(e);
}
Es wird protokolliert:
Fehler: Es ist etwas Unerwartetes aufgetreten.
at main (c: \ Users \ Me \ Documents \ MyApp \ app.js: 9: 15)
at Object. (c: \ Benutzer \ Me \ Dokumente \ MyApp \ app.js: 17: 1)
unter Module._compile (module.js: 460: 26)
unter Object.Module._extensions..js (module.js: 478: 10 )
bei Module.load (module.js: 355: 32)
bei Function.Module._load (module.js: 310: 12)
bei Function.Module.runMain (module.js: 501: 10)
beim Start (node.js) : 129: 16)
bei node.js: 814: 3
Wenn Ihre Node.js-Version <als 6.0.0 ist , reicht die Protokollierung des Exception-Objekts nicht aus. In diesem Fall wird nur gedruckt:
[Fehler: Es ist etwas Unerwartetes aufgetreten.]
Verwenden Sie für die Knotenversion <6 console.error(e.stack)
anstelle von console.error(e)
, um die Fehlermeldung plus den vollständigen Stapel zu drucken, wie dies bei der aktuellen Knotenversion der Fall ist.
Hinweis: Wenn die Ausnahme wie eine Zeichenfolge erstellt wird throw "myException"
, ist es nicht möglich, die Stapelverfolgung abzurufen, und die Protokollierung e.stack
liefert undefinierte Ergebnisse .
Um sicher zu gehen, können Sie verwenden
console.error(e.stack || e);
und es wird für alte und neue Node.js-Versionen funktionieren.
console.error(e)
drucken alles im e
Objekt, einschließlich e.stack
?
So drucken Sie die Stapelverfolgung Error
in der Konsole besser lesbar:
console.log(ex, ex.stack.split("\n"));
Beispielergebnis:
[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)' ]
Mit einem sofort verfügbaren Node-Modul ist es möglich, Stack-Traces in voller Länge aus Node herauszuholen (allerdings mit einem geringen Leistungsverlust): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack -traces-for-node-js
Versuchen Sie Error.captureStackTrace (targetObject [, constructorOpt]) .
const myObj = {};
function c() {
// pass
}
function b() {
Error.captureStackTrace(myObj)
c()
}
function a() {
b()
}
a()
console.log(myObj.stack)
Die Funktion a
und b
werden im Fehlerstapel erfasst und in gespeichert myObj
.
stack
Eigenschaft haben soll, müssen Sie dies aufrufen, wenn Node> = 6 : Error.captureStackTrace(error)
.
Error.captureStackTrace
im Stack-Trace angezeigt wird, können Sie ihn weglassen, indem Sie ihn als constructorOpt
Argument übergeben.
Soweit ich weiß, ist das Drucken des vollständigen Stack-Trace in NodeJS nicht möglich. Sie können einfach einen "partiellen" Stack-Trace drucken. Sie können nicht sehen, woher Sie im Code stammen und wo die Ausnahme auftritt. Das erklärt Ryan Dahl in diesem Youtube-Video. http://youtu.be/jo_B4LTHi3I um mindestens 56:30 Uhr, um genau zu sein. Hoffe das hilft
Die Antwort von @isaacs ist korrekt, aber wenn Sie einen spezifischeren oder saubereren Fehlerstapel benötigen , können Sie diese Funktion verwenden:
function getCleanerStack() {
var err = new Error();
Error.captureStackTrace(err, getStack);
return err.stack;
}
Diese Funktion ist direkt von der console.trace
Funktion in inspiriert NodeJS .
Quellcode: Aktuelle Version oder alte Version .
err.stack
ist die richtige Antwort.
Wenn Sie nur den Stack-Trace des Fehlers (und nicht die Fehlermeldung) protokollieren möchten, enthält Knoten 6 und höher automatisch den Fehlernamen und die Meldung im Stack-Trace. Dies ist etwas ärgerlich, wenn Sie eine benutzerdefinierte Fehlerbehandlung durchführen möchten:
console.log(error.stack.replace(error.message, ''))
Bei dieser Problemumgehung werden nur der Fehlername und die Stapelverfolgung protokolliert (so können Sie beispielsweise die Fehlermeldung formatieren und an einer anderen Stelle in Ihrem Code anzeigen, wie Sie möchten).
Das obige Beispiel würde nur den Fehlernamen drucken, dem die Stapelverfolgung folgt, zum Beispiel:
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)
Anstatt:
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)
Falls jemand immer noch so sucht wie ich, dann gibt es ein Modul namens "Stack-Trace". Es ist sehr beliebt. NPM Link
Dann gehen Sie durch die Spur.
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.map(function (item){
console.log(new Date().toUTCString() + ' : ' + item.toString() );
});
Oder drucken Sie einfach die Spur aus:
var stackTrace = require('stack-trace');
.
.
.
var trace = stackTrace.get();
trace.toString();
Sie können das Node-Stack-Trace- Modul verwenden, bei dem es sich um ein Power-Full-Modul handelt, um Anrufstapel zu verfolgen.
sys.puts(new Error().stack)
(nach dem Hinzufügen des Systemmoduls)