Handling error in Promises
A promise.done()
method that throws if it receives a rejected promise has
been discussed, but the consensus seems to be that browsers instead should
report on rejected unhandled promises that are garbage collected. This is
already implemented in Firefox (at least in the DevTools edition), where
the following code will end up with an error in the console:
var p = new Promise(function(){throw new Error("oh noes");})
p = null;
Since there is no way to handle the thrown error outside the promise (the
exception is thrown after the function returns) there isn't any reason for
the exception to travel up the stack. Either the exception must be handled
as a rejected promise or it must be handled in something like
window.onerror
.
Marius Gundersen
You might try reading through some of the previous threads that talk about the trickiness of surfacing promise errors in the general case.
Unfortunately these threads usually devolve into an endless thread of discussion and debate that become next to impossible to actually read through later without several hours of spare time and a bottle of whiskey... But here's a recent one that's not too long and kind of talks about a couple of ideas:
esdiscuss.org/topic/async-await-improvements (long, but talks about a couple potential/proposed solutions)
Awhile back I did my best to summarize some of the previous es-discuss threads on a related GitHub thread: iojs/io.js#11
Please see the immediately following comment as well for some clarification on how Bluebird surfaces unhandled rejections.
Bluebird: (errors thrown - Good) jsbin.com/kahuzi/1/edit?html,js,console
native ES6:(errors not thrown) jsbin.com/qivobibowa/3/edit?html,js,console
Shouldn't all Uncaught errors be thrown, instead of catching it inside the promise only ? For example, If I use Promise within a promise, the uncaught error in the inner Promise will never be exposed to the outside world and there is no way to bubble it up to the outside blocks.
.catch(function(err) { throw err; })
will also be caught and nothing would be thrown.