import sys def dump_stack(where): print("-- {} --".format(where)) frame = sys._getframe(1) while frame: print(frame.f_code.co_name) frame = frame.f_back def f(): dump_stack("f before yielding") yield from g() dump_stack("f after yielding") def g(): dump_stack("g before yielding") yield from h() dump_stack("g after yielding") def h(): dump_stack("h before yielding") try: yield except Exception: pass dump_stack("h after yielding") gen = f() gen.send(None) try: # Replace this with gen.send(None) and you get sensible stacks gen.throw(RuntimeError) except StopIteration: pass