[Stackless] added tasklet.throw
Kristján Valur Jónsson
kristjan at ccpgames.com
Thu Apr 4 11:44:58 CEST 2013
Yesterday I checked in a new feature to stackless.
Tasklets now have a new function, "throw", which enhances the already present tasklet.raise_exception().
"tasklet.throw(exc, val, tb, immediate=True) -- raise an exception for the tasklet.\n\
'exc', 'val' and 'tb' have the same semantics as Python's 'raise' statement.\n\
If 'immediate' is True, the tasklet is immediately activated, otherwise, it is\n\
merely made runnable");
This brings two new features:
a) unifies the argument semantics. It now takes the same three arguments as a python "raise" expression, just like channel.send_throw() already does.
b) It allows the target to be scheduled, rather than invoked immediately. This is useful in frameworks, for example to send a timeout error to a tasklet without interrupting regular scheduling.
c) if the exception cannot be sent because the target is dead/not yet running, then a RuntimeError is raised.
item c) is the reason we can't let the existing kill and raise_exception methods use this. They have the confusing property that if the target is dead or not running yet, the error will be raised on the main tasklet instead. I actually think that this is a pretty bad idea. I wonder if anyone is depending on this? If not, I can make kill and raise_exception a special case of the new one.
(channel.send_throw() is also a fairly recent addition. An improvement on channel.send_exception() it allows the user to send an existing excetption instance, and a traceback, over the channel. It is particularly the sending of tracebacks which is useful when handling errors.)
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Stackless