2013-05-23 12 views
7

Próbuję złapać ślad stosu danego node.js uncaughtException i działa dobrze dla różnych błędów, ale nie do zrzucenia() sprawozdania:Brakujące ślad stosu na node.js uncaughtException generowane przez rzut()

prawidłowe ślad stosu na obsługę wyjątków:

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

Brakujące ślad stosu na wyjątek spowodowany przez rzut():

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

$ node errorThrow.js 
uncaughtException occurred: undefined 
$ 

jakiś pomysł, dlaczego?

Dzięki Jose

Disclaimer: wiem, że za pomocą process.on („uncaughtException”) jest bardzo, bardzo złe i będę karane, ale przy użyciu domen nie jest opcją w tym kodzie.

Odpowiedz

7

JavaScript pozwala rzucić wszystko.

Jeśli chcesz rzucić błędy ze śladami stosu w JavaScript, musisz rzucić obiekty Error. (specification)

Ponadto rzut jest operatorem, a nie funkcją.

Spróbuj

throw new Error('my error'); 

Zobacz the manual na Mozilla Developer Network, aby uzyskać więcej informacji.

+0

Jeśli chcesz, abym wyjaśnił, jak i dlaczego jest to wykonywane na poziomie maszyny wirtualnej (w wersji 8), daj mi znać. Doszedłem do wniosku, że nie ma to znaczenia dla rozwiązania twojego problemu. –

+0

Dzięki Benjamin za odpowiedź !. Czy wiesz, dlaczego zachowanie jest inne w Web Worker? Rzut; oświadczenie wewnątrz wywołania Web Worker (jeśli jest zarejestrowane) wywołania zwrotnego onerror zawierającego opis, lineno, colno, itp. – JoseOlcese

+0

@JoseOlcese Tak, najprostszą odpowiedzią na to byłoby to, ponieważ tak zostały zaprojektowane. WebWorkers są częścią standardowego węzła sieciowego, który nie jest zgodny. To tylko WebWorkers są przydatne. Ogólnie rzecz biorąc, zawsze powinieneś wyrzucać obiekty błędu, a nie inne rzeczy, gdy zależy ci na debugowaniu (które zawsze powinno być z błędami). –

Powiązane problemy