Brandon Benvie wrote:
The magical quality that throw has is its ability to end multiple call
frames at once. Much like a second continuation channel, or the error
channel in a promise, it escapes past any number of listeners on the
normal channel, only stopping at the first listener on the error channel.
Yes. The problem is, it is only one global channel. Thus, all exception
sent down to it can be in different contexts, but must be multiplexed
into that one channel.
For example in Amber, non-local returns are emulated via throw. A try is
cheap, but catch is expensive, so when non-local return happens nested
in five more methods that also include non-local return, five
catch/rethrow happens.
So to answer David's questoin, this is definitely a case for
_something_like_ conditional catch clause.
But these channels are better idea. I think we may have multiple
exception-like channels. One is present by default (the classical
throw/catch), but one could have more parallel ones.
Then I can assume `throw foo` is the sugar for
Reflect.errorChannel.raise(foo). And syntax of try could be enhanced to,
say:
try(channel) { .... } catch (ex) { .... } finally { ... }
Then normal `try {...` is sugar for `try(Reflect.errorChannel) {...`.
And one could simple `let myChannel = new TryCatchChannel();` and use
it. It can have some minimal api, like
channel.raise(exception);
channel.pass(); // this does not break the original stack
and others are also interesting, but are probably beyond any simple
proposal, like:
channel.defaultHandler = ex => console.log("Unhandled: "+ex);
channel.resume(returnValueFromRaise); //fail if no raise is actually
handled
etc.
Herby
P.S.: Maybe this could already be done with generator magic and yield; I
did not research.
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss