2010-05-27 12 views

Antwort

469

Jedes Error Objekt verfügt über 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!") 
+1

oder einfach 'sys.puts (new Error(). Stack)' (nach dem Hinzufügen des Systemmoduls) – sirhc

+4

Ab sofort ist sys entzogen. Es wird durch "util" ersetzt. – Pindatjuh

+10

+1 für die Anzeige von 'new Error() .stack', was in Fällen funktioniert, in denen Sie die Konsole nicht einbeziehen möchten. –

162

Jetzt gibt es eine dedicated function on console dafür:

console.trace() 
+9

Achte nur darauf, [den obigen Kommentar] (http://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-nodejs#comment21085596_2932410) über 'console.trace()' zu beachten . – Qix

+4

Standardmäßig werden nur 10 Frames angezeigt. Sie können das Befehlszeilenargument verwenden, um das zu erhöhen, z. '--stack_trace_limit = 200' – Michael

3

Für das, was ich weiß, das Drucken der komplette Stack-Trace in NodeJS nicht möglich ist, können Sie einfach Drucken Sie eine "teilweise" Stack-Trace, Sie können nicht sehen, woher Sie im Code kamen, nur wo die Ausnahme auftreten. Das erklärt Ryan Dahl in diesem Youtube-Video. http://youtu.be/jo_B4LTHi3I bei min 56:30 für genau zu sein. Hope this

+1

wahr, aber das Modul in @ Timboudreau Antwort "behebt", dass –

7

Mit einem leicht zugänglichen Knotenmodul hilft, ist es möglich, in voller Länge Stack-Traces aus Knoten zu erhalten (wenn auch mit einer geringeren Leistungseinbuße): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js

+0

Link tot, aber man kann die [archivierte Kopie hier] (https://web.archive.org/web/20160309113159/http : //www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-nodejs) oder [Bibliothek] (https://github.com/mattinsler/longjohn). –

31

Um stacktrace von Error in der Konsole in mehr zu drucken lesbare Weise:

console.log(ex, ex.stack.split("\n")); 

Beispiel Ergebnis:

[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)' ] 
57

Wie bereits beantwortet, können Sie einfach der trace Befehl:

console.trace("I am here"); 

jedoch , wenn Sie auf diese Frage kommen Benutzer darüber, wie der Stack-Trace einer Ausnahme anmelden, 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 log:

Error: Something unexpected has occurred.
    at main (c:\Users\Me\Documents\MyApp\app.js:9:15)
    at Object. (c:\Users\Me\Documents\MyApp\app.js:17:1)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3


Wenn Ihr Node.js Version < als 6.0.0, Protokollierung der Exception-Objekt sein wird, ist nicht genug. In diesem Fall druckt es nur:

[Error: Something unexpected has occurred.]

Für Node-Version < 6, verwenden console.error(e.stack) statt console.error(e) die Fehlermeldung und den vollständigen Stapel zu drucken, wie der aktuelle Knoten Version der Fall ist.


Hinweis:, wenn die Ausnahme als String wie throw "myException" erstellt wird, ist es nicht möglich, den Stack-Trace abrufen und e.stack ergibt Protokollierung undefined.

Um sicher zu sein, Sie

console.error(e.stack || e); 

und es wird funktionieren für alte und neue Node.js Möglichkeiten nutzen.

+0

Wird 'console.error (e)' nicht * alles * im 'e' Objekt drucken, einschließlich' e.stack'? – drmrbrewer

+1

@drmrbrewer, vielen Dank, dass Sie darauf hingewiesen haben. Es scheint, dass sich das Verhalten zwischen den Knotenversionen 4.x und 7.x geändert hat (vermutlich eine V8-Änderung). Ich habe meine Antwort aktualisiert. – Zanon

+1

@drmrbrewer hat bestätigt, dass sich dieses Verhalten in Version 6.0.0 geändert hat – Zanon

2

Wenn Sie nur den Stack-Trace des Fehlers protokollieren möchten (und nicht die Fehlermeldung), fügt Knoten 6 und höher automatisch den Fehlernamen und die Nachricht in den Stack-Trace ein. Das ist ein bisschen ärgerlich, wenn Sie etwas tun wollen benutzerdefinierte Fehlerbehandlung:

console.log(error.stack.replace(error.message, ''))

Diese Problemumgehung wird nur protokolliert die Fehlernamen und Stack-Trace (so können Sie zum Beispiel, formatieren Sie die Fehlermeldung und es zeigt, wie Sie woanders in Ihrem Code wollen).

Das obige Beispiel würde nur der Fehlername folgt durch den Stack-Trace, zum Beispiel drucken:

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) 

Statt:

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) 
Verwandte Themen