summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/objgenerator.c4
-rw-r--r--tests/basics/generator-exc.py20
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")