3 ms·
I gave a talk about handling errors in Node a few years ago: https://github.com/pjungwir/node-errors-talk https://github.com/pjungwir/node-errors-talk At the
by pjungwir 10y ago
I gave a talk about handling errors in Node a few years ago:
https://github.com/pjungwir/node-errors-talk https://github.com/pjungwir/node-errors-talk
At the time the solution was "use domains", but I think domains are deprecated now. It was painful enough that I have stuck with Rails since then. I'm glad to hear that Promises are an improvement!
- koolba 10y agoDomains have been deprecated since at least 0.10. As of yet there's no replacement for them and all node apps should be using them. There's no other way to catch "But ... but ... that can't happen!" type errors.
- spion 10y agoThere is no replacement because they're a fundamentally broken idea. They require the following to happen, in that order: * V8 needs to optimize try-finally * Node core needs to add try-finally at every single place where callbacks are invoked and make sure all state and resource cleanup is properly done to support domains * Popular libraries need to also add try-finally handlers for the above. As to why this is a problem in node and not so much in other languages, its because with node callbacks, the call stack goes both ways. In other languages, libraries mostly call their dependencies' code. In node's CPS style, you call the library but the library also calls your closure code. The semantics for the 2nd part aren't well defined in node - the loose law basically says: I wont call you twice, I'll try not to call you synchronously, and you wont throw (and if you do the behavior is undefined). With promises there is a contract and its enforced by the promise implementation. Since Promises actually have error semantics, you can build resource management strategies on top of them. http://promise-nuggets.github.io/articles/21-context-managers-transactions.html http://promise-nuggets.github.io/articles/21-context-manager... - and consequently there is no reason to crash your server on errors.
- lobster_johnson 10y agoDomains are used for another reason: To emulate thread-local variables. I hope that support is not going away, because it's really handy.
- spion 10y agoIts interesting that the same problem (TLS) can also be solved with something similar to promises :)
- 0xmohit 10y ago"A few years" is a very long time for a relatively new and evolving language. Perhaps that is the reason that people have become more conscious of making _drastic_ changes -- rust and go are examples.