diff -r 104fdc42bcd1 Lib/test/test_coroutines.py --- a/Lib/test/test_coroutines.py Tue Dec 06 13:43:46 2016 +0200 +++ b/Lib/test/test_coroutines.py Tue Dec 06 20:38:53 2016 -0800 @@ -1552,6 +1552,46 @@ warnings.simplefilter("error") run_async(foo()) + def test_for_11(self): + class F: + def __aiter__(self): + return self + def __anext__(self): + return self + def __await__(self): + 1 / 0 + + async def main(): + async for _ in F(): + pass + + with self.assertRaisesRegex(TypeError, + 'an invalid object from __anext__') as c: + main().send(None) + + err = c.exception + self.assertIsNone(err.__cause__) + self.assertIsInstance(err.__context__, ZeroDivisionError) + + def test_for_12(self): + class F: + def __aiter__(self): + return self + def __await__(self): + 1 / 0 + + async def main(): + async for _ in F(): + pass + + with self.assertRaisesRegex(TypeError, + 'an invalid object from __aiter__') as c: + main().send(None) + + err = c.exception + self.assertIsNone(err.__cause__) + self.assertIsInstance(err.__context__, ZeroDivisionError) + def test_for_tuple(self): class Done(Exception): pass diff -r 104fdc42bcd1 Python/ceval.c --- a/Python/ceval.c Tue Dec 06 13:43:46 2016 +0200 +++ b/Python/ceval.c Tue Dec 06 20:38:53 2016 -0800 @@ -1979,13 +1979,16 @@ awaitable = _PyCoro_GetAwaitableIter(iter); if (awaitable == NULL) { - SET_TOP(NULL); + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); PyErr_Format( PyExc_TypeError, "'async for' received an invalid object " "from __aiter__: %.100s", Py_TYPE(iter)->tp_name); - + _PyErr_ChainExceptions(exc, val, tb); + + SET_TOP(NULL); Py_DECREF(iter); goto error; } else { @@ -2036,11 +2039,14 @@ awaitable = _PyCoro_GetAwaitableIter(next_iter); if (awaitable == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); PyErr_Format( PyExc_TypeError, "'async for' received an invalid object " "from __anext__: %.100s", Py_TYPE(next_iter)->tp_name); + _PyErr_ChainExceptions(exc, val, tb); Py_DECREF(next_iter); goto error;