coroutine, throw, yield, call-stack and exception handling

Veek. M vek.m1234 at gmail.com
Mon Feb 8 04:17:02 EST 2016


****************************
Exceptions can be raised inside a coroutine using the throw(

Exceptions raised in this manner will originate at the currently 
executing yield state-ment in the coroutine.A coroutine can elect to 
catch exceptions and handle them as appropriate. It is not safe to use 
throw() as an asynchronous signal to a coroutine—it should never be 
invoked from a separate execution thread or in a signal handler.
****************************

What does Beazley mean by this: 'will originate at the currently 
executing yield state-ment in the coroutine'

If he's throw'ing an exception surely it originates at the throw:

def mycoroutine():
 while len(n) > 2: 
   n = (yield)

 throw('RuntimeError' "die!") 
----------------------
Also: 'not safe to use throw() as an asynchronous signal to a coroutine—
it should never be invoked from a separate execution thread or in a 
signal handler.'

You can use throw within a coroutine to raise an exception.
How would you use it as an async-sig to a coroutine..
eg: you have two threads 
1. coroutine does except FooException:
2. throw(FooException, 'message')

so moment 'throw' runs and an exception is raised.. it'll propagate 
within thread-2 to its parent etc - how is thread-1 affected?


More information about the Python-list mailing list