try nodejs node handling example error custom create catch javascript node.js stack-trace

javascript - nodejs - node js throw exception



¿Cómo imprimir una traza de pila en Node.js? (9)

¿Alguien sabe cómo imprimir un seguimiento de pila en Node.js?



Como ya se respondió, simplemente puede usar el comando trace :

console.trace("I am here");

Sin embargo, si llegó a esta pregunta buscando cómo registrar el seguimiento de pila de una excepción , simplemente puede registrar el objeto Excepción.

try { // if something unexpected throw new Error("Something unexpected has occurred."); } catch (e) { console.error(e); }

Se registrará:

Error: Ha ocurrido algo inesperado.
en main (c: / Users / Me / Documents / MyApp / app.js: 9: 15)
en el objeto. (c: / Users / Me / Documents / MyApp / app.js: 17: 1)
en Module._compile (module.js: 460: 26)
en Object.Module._extensions..js (module.js: 478: 10)
en Module.load (module.js: 355: 32)
en Function.Module._load (module.js: 310: 12)
en Function.Module.runMain (module.js: 501: 10)
en el inicio (node.js: 129: 16)
en node.js: 814: 3


Si su versión de Node.js es inferior a 6.0.0 , el registro del objeto Excepción no será suficiente. En este caso, se imprimirá sólo:

[Error: algo inesperado ha ocurrido.]

Para la versión de nodo <6, use console.error(e.stack) lugar de console.error(e) para imprimir el mensaje de error más la pila completa, como lo hace la versión actual de Node.


Nota: si la excepción se crea como una cadena como throw "myException" , no es posible recuperar el seguimiento de la pila y el registro de e.stack produce undefined .

Para estar seguro, puedes usar

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

y funcionará para versiones antiguas y nuevas de Node.js.



Para imprimir stacktrace de Error en la consola de forma más legible:

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

Resultado de ejemplo:

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


Por lo que sé, no es posible imprimir el seguimiento completo de la pila en nodejs, solo puede imprimir un seguimiento "parcial" de la pila, no puede ver de dónde vino en el código, solo el lugar donde se produce la excepción. Eso es lo que Ryan Dahl explica en este video de youtube. http://youtu.be/jo_B4LTHi3I en el minuto 56:30 para ser precisos. Espero que esto ayude


Pruebe Error.captureStackTrace (targetObject [, constructorOpt]) .

const myObj = {}; function c() { // pass } function b() { Error.captureStackTrace(myObj) c() } function a() { b() } a() console.log(myObj.stack)

Las funciones b se capturan en la pila de errores y se almacenan en myObj .


Si solo desea registrar el seguimiento de la pila del error (y no el mensaje de error), el Nodo 6 y superior incluyen automáticamente el nombre y el mensaje de error dentro del seguimiento de la pila, lo cual es un poco molesto si desea realizar un manejo de errores personalizado:

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

Esta solución registrará solo el nombre del error y el seguimiento de la pila (de modo que, por ejemplo, puede formatear el mensaje de error y mostrarlo como desee en otra parte de su código).

El ejemplo anterior solo imprimirá el nombre del error seguido del seguimiento de la pila, por ejemplo:

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)

En lugar 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)


puede usar el módulo de node-stack-trace que es un módulo lleno de energía para rastrear las pilas de llamadas.


Cualquier objeto de Error tiene un miembro de stack que atrapa el punto en el que se construyó.

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

o más simplemente:

console.trace("Here I am!")