2010-05-27 14 views

Respuesta

469

Cualquier objeto Error tiene un miembro 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!") 
+1

o simplemente 'sys.puts (nuevo Error(). Stack)' (después de agregar el módulo del sistema) – sirhc

+4

A partir de ahora, sys está privado. Se reemplaza por ''util''. – Pindatjuh

+10

+1 para mostrar también 'new Error(). Stack', que funciona en los casos en los que no desea involucrar a la consola. –

162

Ahora hay una dedicated function on console para ello:

console.trace() 
+9

Solo asegúrese de prestar atención [al comentario anterior] (http://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-nodejs#comment21085596_2932410) acerca de 'console.trace()' . – Qix

+4

De manera predeterminada, esto solo mostrará 10 fotogramas, puede usar el argumento de línea de comandos para aumentar esto, p. '--stack_trace_limit = 200' – Michael

3

Por lo que sé imprimiendo el seguimiento de la pila completa en nodejs no es posible, que sólo puede imprime un rastro de pila "parcial", no puedes ver de dónde vienes en el código, justo donde se produce la excepción. Eso es lo que explica Ryan Dahl en este video de youtube. http://youtu.be/jo_B4LTHi3I a las 00:56 min para ser preciso. Espero que esto ayude

+1

cierto, pero el módulo en la respuesta de @ Timboudreau "corrige" que –

7

Con un módulo Nodo fácilmente disponible, es posible obtener seguimientos de pila de larga duración de Nodo (aunque con una penalización de rendimiento): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js

+0

Enlace muerto, pero se puede leer detenidamente la [copia archivada aquí] (https://web.archive.org/web/20160309113159/http : //www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-nodejs) o consulte [la biblioteca] (https://github.com/mattinsler/longjohn). –

31

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

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

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

Como ya ha respondido, puede simplemente usar el comando trace:

console.trace("I am here"); 

Sin embargo, si llegó a esta pregunta buscando información sobre cómo registrar el seguimiento de la pila de una excepción, sólo tiene que registrar el objeto de excepción.

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

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

se registrará:

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


Si su versión Node.js es que < 6.0.0, registrando el objeto de excepción no será suficiente. En este caso, sólo imprimirá:

[Error: Something unexpected has occurred.]

Para la versión Nodo < 6, utilice console.error(e.stack) en lugar de console.error(e) para imprimir el mensaje de error más la pila completa, al igual que la versión actual del nodo hace.


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

Para estar seguro, puede utilizar

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

y va a trabajar para versiones antiguas y nuevas Node.js.

+0

¿'console.error (e)' no imprimirá * todo * en el objeto 'e', incluido' e.stack'? – drmrbrewer

+1

@drmrbrewer, gracias por señalar esto. Parece que el comportamiento ha cambiado entre las versiones de nodo 4.x y 7.x (probablemente un cambio de V8). He actualizado mi respuesta. – Zanon

+1

@drmrbrewer confirmó que este comportamiento cambió en la versión 6.0.0 – Zanon

0

puede usar el módulo node-stack-trace que es un módulo de potencia completa para rastrear las pilas de llamadas.

2

Si solo desea registrar el seguimiento de la pila del error (y no el mensaje de error) El nodo 6 y superior incluye automáticamente el nombre y el mensaje del error dentro del seguimiento de la pila, lo cual es un poco molesto si desea gestión de errores personalizado:

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

Esta solución registrará sólo el nombre de error y seguimiento de la pila (por lo que puede, por ejemplo, dar formato al mensaje de error y lo mostrará cómo desea algún otro lugar en su código).

El ejemplo anterior imprimir sólo el nombre de error de seguimiento por el 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) 
Cuestiones relacionadas