Wrong exception re-raises if task raises CancelledError inside except block #287

Open
germn opened this Issue Nov 12, 2015 · 6 comments

Projects

None yet

3 participants

@germn
germn commented Nov 12, 2015
import asyncio
from contextlib import suppress


async def main():
    task = asyncio.ensure_future(asyncio.sleep(1))
    task.cancel()

    try:
        raise Exception()
    except Exception:
        with suppress(asyncio.CancelledError):
            await task
        raise

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

Expected output:

Exception

Actual output:

concurrent.futures._base.CancelledError

Windows 10, Python 3.5.0

@gvanrossum
Member
@1st1
Member
1st1 commented Nov 12, 2015

I might be mistaken here, but it looks like this a bug in CPython...

class MainError(Exception):
    pass

class SubError(Exception):
    pass

def sub():
    yield

def main():
    try:
        raise MainError()
    except MainError:
        try:
            yield from sub()
        except SubError:
            pass
        raise

coro = main()
coro.send(None)
coro.throw(SubError())

Outputs:

Traceback (most recent call last):
  File "t.py", line 47, in <module>
    coro.throw(SubError())
  File "t.py", line 43, in main
    raise
RuntimeError: No active exception to reraise
@1st1
Member
1st1 commented Nov 12, 2015

And if you replace except MainError: with except MainError as e:, and raise with raise e then everything works correctly.

@1st1
Member
1st1 commented Nov 12, 2015

It's not even a yield from bug:

class MainError(Exception):
    pass

class SubError(Exception):
    pass

def main():
    try:
        raise MainError()
    except MainError:
        try:
            yield
        except SubError:
            print('got SubError')
        raise

coro = main()
coro.send(None)
coro.throw(SubError())

Outputs:

got SubError
Traceback (most recent call last):
  File "t.py", line 19, in <module>
    coro.throw(SubError())
  File "t.py", line 15, in main
    raise
RuntimeError: No active exception to reraise
@gvanrossum
Member
@1st1 1st1 referenced this issue Nov 16, 2015
Closed

Cleanup Future API #292

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment