2013-05-23 6 views
7

Ich versuche, die Stack-Trace eines node.js uncaughtException zu fangen und es für verschiedene Fehler funktioniert gut, aber nicht für throw() Angaben:Fehlende Stack-Trace auf node.js uncaughtException von throw() erzeugt

korrekte Stack-Trace auf die Ausnahmebehandlung:

$ 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 
$ 

Fehlende Stack-Trace auf Ausnahme von Wurf verursacht():

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

$ node errorThrow.js 
uncaughtException occurred: undefined 
$ 

Jede Idee, warum?

Dank Jose

Haftungsausschluss: Ich weiß, dass process.on mit (‚uncaughtException‘) ist ein sehr, sehr schlechte Sache, und ich werde aber Domains verwendet werden bestraft ist in diesem Code keine Option.

Antwort

7

JavaScript lässt Sie alles werfen.

Wenn Sie Fehler mit Stack-Traces in JavaScript auslösen möchten, müssen Sie Error Objekte werfen. (specification)

Auch werfen ist ein Operator und keine Funktion. Weitere Informationen

Versuchen

throw new Error('my error'); 

the manual auf Mozilla Developer Network.

+0

Wenn Sie möchten, dass ich näher erläutere, wie und warum dies auf der Ebene der virtuellen Maschine (in v8) geschieht, lassen Sie es mich wissen. Ich dachte mir, dass das für die Lösung Ihres Problems nicht relevant ist. –

+0

Danke Benjamin für die Antwort !. Weißt du, warum das Verhalten in einem Web Worker anders ist? Ein Wurf; Anweisung in einem Web Worker-Aufruf (falls registriert) der Onerror-Callback mit Beschreibung, Lineno, Colno, etc. – JoseOlcese

+0

@JoseOlcese Ja, die einfachste Antwort wäre, dass das so ist, weil sie so entworfen wurden. WebWorker sind ein Teil des Web-Standard-Knotens, an den sich der Web-Standard nicht hält. Es sind nur WebWorker, die nützlich sind. Im Allgemeinen sollten Sie immer Fehlerobjekte und keine anderen Dinge werfen, wenn Sie sich um das Debuggen kümmern (was immer mit Fehlern behaftet sein sollte). –

Verwandte Themen