660 Stimmen

Wie drucke ich einen Stack-Trace in Node.js?

Weiß jemand, wie man einen Stack-Trace in Node.js drucken?

761voto

isaacs Punkte 16053

任意の Error Objekt hat eine stack Mitglied, das den Punkt einfängt, an dem es konstruiert wurde.

var stack = new Error().stack
console.log( stack )

oder einfacher ausgedrückt:

console.trace("Here I am!")

2 Stimmen

Oder einfach sys.puts(new Error().stack) (nach Hinzufügen des Systemmoduls)

6 Stimmen

Ab sofort ist sys aus dem Verkehr gezogen. Es wird ersetzt durch 'util' .

13 Stimmen

+1 auch für die Anzeige new Error().stack Dies funktioniert in Fällen, in denen Sie die Konsole nicht einbeziehen wollen.

254voto

Mariusz Nowak Punkte 30152

Jetzt gibt es eine spezielle Funktion auf der Konsole dafür:

console.trace()

16 Stimmen

Achten Sie nur darauf, dass Sie der obige Kommentar über console.trace() .

13 Stimmen

Standardmäßig werden nur 10 Bilder angezeigt. Mit dem Befehlszeilenargument können Sie diese Zahl erhöhen, z. B. --stack_trace_limit=200

2 Stimmen

Was ist, wenn Sie in eine Protokolldatei ausgeben möchten?

150voto

Zanon Punkte 25577

Wie bereits beantwortet, können Sie einfach die Spur Befehl:

console.trace("I am here");

Allerdings, wenn Sie auf diese Frage gekommen sind, weil Sie wissen wollten, wie man den Stack-Trace einer Ausnahme protokolliert können Sie einfach das Exception-Objekt protokollieren.

try {  
  // if something unexpected
  throw new Error("Something unexpected has occurred.");     

} catch (e) {
  console.error(e);
}

Es wird protokolliert:

Fehler: Es ist etwas Unerwartetes passiert.
    bei main (c: \Users\Me\Documents\MyApp\app.js :9:15)
    bei 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)
    beim Starten (node.js:129:16)
    bei node.js:814:3

Wenn Ihre Node.js-Version kleiner als 6.0.0 ist ist die Protokollierung des Exception-Objekts nicht ausreichend. In diesem Fall wird es nur gedruckt:

[Fehler: Es ist etwas Unerwartetes passiert].

Für Node Version < 6, verwenden Sie console.error(e.stack) 代わりに console.error(e) um die Fehlermeldung und den vollständigen Stack auszugeben, wie es die aktuelle Node-Version tut.

Anmerkung: wenn die Ausnahme als Zeichenkette erstellt wird wie throw "myException" ist es nicht möglich, den Stack-Trace und die Protokollierung abzurufen e.stack ergibt undefiniert .

Um sicher zu gehen, können Sie Folgendes verwenden

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

und es wird für alte und neue Node.js-Versionen funktionieren.

0 Stimmen

Wird nicht console.error(e) drucken alles en el e Objekt, einschließlich e.stack ?

1 Stimmen

@drmrbrewer, vielen Dank für diesen Hinweis. Es scheint, dass sich das Verhalten zwischen den Node-Versionen 4.x und 7.x geändert hat (wahrscheinlich eine V8-Änderung). Ich habe meine Antwort aktualisiert.

1 Stimmen

@drmrbrewer hat bestätigt, dass sich dieses Verhalten mit Version 6.0.0 geändert hat

41voto

ruX Punkte 6852

So drucken Sie den Stacktrace von Error in der Konsole in besser lesbarer Form:

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

Beispielhaftes 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)' ]

12voto

@isaacs Antwort ist richtig, aber wenn Sie spezifischere oder sauberere Fehlerstapel 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 NodeJS .

Quellcode: Neueste Version ou Alte Fassung .

4 Stimmen

Funktioniert nicht, es wird nur der Stack der aktuellen Zeile angezeigt (nicht die Zeile, in der der Fehler auftrat). err.stack ist die korrektere Antwort.

14 Stimmen

GetStack ist nicht definiert

0 Stimmen

Sollte sein getCleanerStack anstelle von getStack in Zeile 3

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X