2013-05-23 19 views
7

Sto cercando di catturare la traccia dello stack di un uncaughtException node.js e funziona bene per diversi errori, ma non per un tiro() dichiarazioni:mancante stack trace on node.js uncaughtException generato da tiro()

Una corretta analisi dello stack sulla gestione delle eccezioni:

$ cat errorFunc.js 
process.on('uncaughtException', function(exception) { 
    console.log('uncaughtException occurred: ' + exception.stack); 
}); 
MyError(); 

$ node errorFunc.js 
    uncaughtException occurred: ReferenceError: MyError is not defined 
    at Object.<anonymous> (/home/jolcese/code/WebEnclaves/Server/errorFunc.js:5:1) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 
$ 

mancante traccia dello stack su un'eccezione causata da tiro():

$ cat errorThrow.js 
process.on('uncaughtException', function(exception) { 
    console.log('uncaughtException occurred: ' + exception.stack); 
}); 
throw('my error'); 

$ node errorThrow.js 
uncaughtException occurred: undefined 
$ 

Qualsiasi idea del perché?

Grazie Jose

Disclaimer: io so che l'uso process.on ('uncaughtException') è una cosa molto, molto male e sarò punito ma utilizzando domini non è un'opzione in questo codice.

risposta

7

JavaScript consente di lanciare qualsiasi cosa.

Se si desidera generare errori con tracce di stack in JavaScript, è necessario gettare oggetti Error. (specification)

Inoltre, throw è un operatore e non una funzione.

Prova

throw new Error('my error'); 

Vedi the manual su Mozilla Developer Network per ulteriori informazioni.

+0

Se desideri che elabori come e perché questo viene fatto a livello di macchina virtuale (in v8) fammi sapere. Ho pensato che non fosse rilevante per risolvere il tuo problema. –

+0

Grazie Benjamin per la risposta !. Sai perché il comportamento è diverso all'interno di un Web Worker? Un tiro; dichiarazione all'interno di una chiamata Web Worker (se registrata) la richiamata onerror che fornisce descrizione, lineno, colno, ecc. – JoseOlcese

+0

@JoseOlcese Sì, la risposta più semplice è che è perché è così che sono stati progettati. I Web Worker fanno parte del nodo standard Web non aderito. È utile solo il Web Worker. Generalmente, dovresti sempre gettare oggetti Error e non altre cose quando ti interessa il debug (che dovrebbe essere sempre con errori) –

Problemi correlati