Default Unhandled Rejection Behavior #26
Description
Update: Agreed course of action:
The agreed on policy is:
- Abort when an unhandled rejection can never be handled (a GC hook @Fishrock123 is working on).
- Warn on late catch handlers since they're likely a mistake. This is easily opt-out for users with legitimate use cases for late bindings but should really help the other 99%.
This should please everyone involved since all use cases are supported and we don't introduce abortive semantics unless we're 100% sure the promise is unhandled. Libraries can even decide to opt out of the default behavior.
Continuation of nodejs/node#830
After a few months of process.on("unhandledRejection"
event I'm convinced we need a saner default.
Just to be clear - this is about the default behaviour of a rejected promise with no catch
handler (or then
handler with a function second argument) attached. Basically - anything that fires
The different approaches
- Throwing an error for
process.on("uncaughtException"
to deal with. - this seems impractical now since the hook has been live in the ecosystem for a while. A flag might solve this. - Causing the process to exit. - this seems impractical now since the hook has been live in the ecosystem for a while. A flag might solve this.
- Do nothing by default. - what we currently do - a lot of complaints about this.
- Logging the rejection to the console. - this is what most browsers do now (namely Chrome) and what bluebird and userland libraries do. I think we should explore that path.
Proposal
When an unhandledRejection
event is fired if no handlers are attached the error is logged to stderr. The current behavior is confusing to users and makes it appear as if promises swallow errors. While the unhandledRejection
hook has been used a lot in the wild a lot of users (even experienced node users) can forget it and get surprising behavior.
People will still be able to opt-out of it by installing any "unhandledRejection"
handler.
This aligns Node's behavior with browsers and other environments as well as userland solutions.