2010-05-27 16 views

risposta

469

Qualsiasi oggetto Error ha un membro stack che intercetta il punto in cui è stato costruito.

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

o più semplicemente:

console.trace("Here I am!") 
+1

o solo 'sys.puts (nuovo errore(). Stack)' (dopo aver aggiunto il modulo di sistema) – sirhc

+4

A partire da ora, sys è privato. È sostituito da "util". – Pindatjuh

+10

+1 per mostrare anche 'new Error(). Stack', che funziona nei casi in cui non si desidera coinvolgere la console. –

162

ora c'è un dedicated function on console per questo:

console.trace() 
+9

Assicurati di prestare attenzione [al commento precedente] (http://stackoverflow.com/questions/2923858/how-to-print-a-stack-trace-in-nodejs#comment21085596_2932410) a proposito di 'console.trace()' . – Qix

+4

Per impostazione predefinita, questo mostrerà solo 10 frame, è possibile utilizzare l'argomento della riga di comando per aumentare questo valore, ad es. '--stack_trace_limit = 200' – Michael

3

Per quello che so stampando la traccia completa dello stack in nodejs non è possibile, si può solo stampa una traccia di stack "parziale", non puoi vedere da dove vieni nel codice, proprio dove si verifica l'Eccezione. Questo è ciò che Ryan Dahl spiega in questo video di YouTube. http://youtu.be/jo_B4LTHi3I al minuto 56:30 per essere precisi. Spero che questo aiuti

+1

true, ma il modulo nella risposta di @ Timboudreau "corregge" che –

7

Con un modulo Node prontamente disponibile, è possibile ottenere le tracce full-length pila di Node (anche se con una penalizzazione delle prestazioni minore): http://www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-node-js

+0

Link dead ma si può esaminare la [copia archiviata qui] (https://web.archive.org/web/20160309113159/http : //www.mattinsler.com/post/26396305882/announcing-longjohn-long-stack-traces-for-nodejs) o controlla [la biblioteca] (https://github.com/mattinsler/longjohn). –

31

Per stampare stacktrace di Error in consolle in più modo leggibile: risultato

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

Esempio:

[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

Come già risposto, si può semplicemente utilizzare il comando trace:

console.trace("I am here"); 

Tuttavia, se si è venuto a questa domanda la ricerca su come accedere alla stack trace di un'eccezione, si può semplicemente accedere l'oggetto eccezione.

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

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

Sarà 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


Se la versione Node.js è < di 6.0.0, la registrazione l'oggetto eccezione non sarà sufficiente. In questo caso, verrà stampata solo:

[Error: Something unexpected has occurred.]

per il nodo versione < 6, utilizzare console.error(e.stack) invece di console.error(e) per stampare il messaggio di errore più lo stack completo, come la versione nodo corrente fa.


Nota: se l'eccezione è creato come una stringa come throw "myException", non è possibile recuperare la traccia dello stack e la registrazione e.stack produce indefinita.

Per essere sicuri, è possibile utilizzare

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

e si lavorerà per le versioni vecchie e nuove Node.JS.

+0

'' console.error (e) 'non stamperà * tutto * nell'oggetto' e', incluso 'e.stack'? – drmrbrewer

+1

@drmrbrewer, grazie per averlo indicato. Sembra che il comportamento sia cambiato tra le versioni Node 4.xe 7.x (probabilmente una modifica V8). Ho aggiornato la mia risposta. – Zanon

+1

@drmrbrewer ha confermato che questo comportamento è cambiato nella versione 6.0.0 – Zanon

0

è possibile utilizzare il modulo node-stack-trace che è un modulo di alimentazione completo per il monitoraggio delle pile di chiamate.

2

Se si desidera registrare solo la traccia di stack dell'errore (e non il messaggio di errore) il nodo 6 e sopra include automaticamente il nome dell'errore e il messaggio all'interno della traccia dello stack, il che è un po 'fastidioso se si desidera eseguire la gestione degli errori personalizzati:

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

Questa soluzione registrerà solo il nome di errore e traccia dello stack (in modo da poter, ad esempio, formattare il messaggio di errore e visualizzarlo come si desidera da qualche altra parte nel codice).

L'esempio precedente stampare solo il nome errore di seguire dal l'analisi dello stack, ad esempio:

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) 

Invece di:

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) 
Problemi correlati