diff options
author | Damien George <damien.p.george@gmail.com> | 2018-03-30 12:37:04 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2018-03-30 12:43:38 +1100 |
commit | f50b64cab58025e080f994147b75a8ffc55d2b35 (patch) | |
tree | 59a1b1fa9fc332dad56d9954321cde7e7f8f40c5 /tests/basics/gen_yield_from_throw3.py | |
parent | 32807881954f106b9735de74fe984062a0815b81 (diff) |
py/runtime: Be sure that non-intercepted thrown object is an exception.
The VM expects that, if mp_resume() returns MP_VM_RETURN_EXCEPTION, then
the returned value is an exception instance (eg to add a traceback to it).
It's possible that a value passed to a generator's throw() is not an
exception so must be explicitly checked for if the thrown value is not
intercepted by the generator.
Thanks to @jepler for finding the bug.
Diffstat (limited to 'tests/basics/gen_yield_from_throw3.py')
-rw-r--r-- | tests/basics/gen_yield_from_throw3.py | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/tests/basics/gen_yield_from_throw3.py b/tests/basics/gen_yield_from_throw3.py index 0f6c7c842..85b6f71f9 100644 --- a/tests/basics/gen_yield_from_throw3.py +++ b/tests/basics/gen_yield_from_throw3.py @@ -28,3 +28,30 @@ print(g.throw(123)) g = gen() print(next(g)) print(g.throw(ZeroDivisionError)) + +# this user-defined generator doesn't have a throw() method +class Iter2: + def __iter__(self): + return self + + def __next__(self): + return 1 + +def gen2(): + yield from Iter2() + +# the thrown ValueError is not intercepted by the user class +g = gen2() +print(next(g)) +try: + g.throw(ValueError) +except: + print('ValueError') + +# the thrown 123 is not an exception so raises a TypeError +g = gen2() +print(next(g)) +try: + g.throw(123) +except TypeError: + print('TypeError') |