diff options
author | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-03-22 16:44:58 +0200 |
---|---|---|
committer | Paul Sokolovsky <pfalcon@users.sourceforge.net> | 2014-03-22 17:55:42 +0200 |
commit | 61fd20f168e96efe1f85246401ee4871a14ad9bd (patch) | |
tree | cecd3e2dd4ade52816febd876afad74b3aaa1028 | |
parent | c0abc28aa1211204c589b9e8062d7c2874b5f083 (diff) | |
download | micropython-61fd20f168e96efe1f85246401ee4871a14ad9bd.tar.gz micropython-61fd20f168e96efe1f85246401ee4871a14ad9bd.zip |
objgenerator: Implement throwing exceptions out of generator.
-rw-r--r-- | py/objgenerator.c | 4 | ||||
-rw-r--r-- | tests/basics/generator-exc.py | 20 |
2 files changed, 23 insertions, 1 deletions
diff --git a/py/objgenerator.c b/py/objgenerator.c index fd7329fb0b..fe927d84e4 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -103,8 +103,10 @@ STATIC mp_obj_t gen_next_send(mp_obj_t self_in, mp_obj_t send_value) { return *self->sp; case MP_VM_RETURN_EXCEPTION: + self->ip = 0; + nlr_jump(self->state[self->n_state - 1]); + default: - // TODO assert(0); return mp_const_none; } diff --git a/tests/basics/generator-exc.py b/tests/basics/generator-exc.py index ebcd06e974..601fa2c00e 100644 --- a/tests/basics/generator-exc.py +++ b/tests/basics/generator-exc.py @@ -9,3 +9,23 @@ def gen(): for i in gen(): print(i) + + +# Test throwing exceptions out of generator +def gen2(): + yield 1 + raise ValueError + yield 2 + yield 3 + +g = gen2() +print(next(g)) +try: + print(next(g)) +except ValueError: + print("ValueError") + +try: + print(next(g)) +except StopIteration: + print("StopIteration") |