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?
Ahora hay una función dedicada en la consola para eso:
console.trace()
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.
Con un módulo de Nodo fácilmente disponible, es posible obtener trazas de pila de longitud completa fuera del Nodo (aunque con una penalización de rendimiento menor): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-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!")