For anyone interested in tickling the low-level CPython internals (in this case eval loop and generators implementations), here's an interesting bug: http://bugs.python.org/issue25612.
I have a patch that fixes it, but I'm not sure that it's correct, and I desperately need someone to review it.
While debugging the issue, I found another oddity:
class MainError(Exception): pass class SubError(Exception): pass
def main(): try: raise MainError() except MainError: yield
coro = main() coro.send(None) coro.throw(SubError())
On the last line of the above snippet, SubError will propagate. However, it won't have it's __context__ set to MainError. Martin Panter suggests that it's not a bug, and after giving this some thought, I now don't think it's a bug too -- SubError was instantiated outside of MainError from a code location where there was no error. Thoughts? Here's a separate issue for the __context__ bug/feature: http://bugs.python.org/issue25683