Caleb Hattingh <caleb.hatti...@gmail.com> added the comment:

Can reproduce also on 3.8. Another version that "works" (raises the exception) 
is

    task = loop.create_task(test())
    del task

Suggests there's something going on with reference counting or garbage 
collection. In the version that "doesn't work", the task exception only appears 
in the custom exception handler when the loop is stopped, not before. I've 
added a log message to show each second that passes, and the loop is stopped 
after 5 seconds:

    import asyncio
    import logging


    def handle_exception(loop, context):
        msg = context.get("exception", context["message"])
        logging.error("Caught exception: %s", msg)


    async def test():
        await asyncio.sleep(1)
        raise Exception("Crash.")


    def second_logger(loop, count) -> int:
        logging.warning(count)
        loop.call_later(1, lambda count=count: second_logger(loop, count + 1))


    def main():
        loop = asyncio.get_event_loop()
        loop.call_later(1, lambda: second_logger(loop, 0))
        loop.call_later(5, loop.stop)
        loop.set_exception_handler(handle_exception)
        task = loop.create_task(test())
        try:
            loop.run_forever()
        finally:
            loop.close()


    if __name__ == "__main__":
        main()

OUTPUT:

    $ py -3.8 -u bpo-issue39839.py
    WARNING:root:0
    WARNING:root:1
    WARNING:root:2
    WARNING:root:3
    WARNING:root:4
    ERROR:root:Caught exception: Crash.

----------
nosy: +cjrh

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue39839>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to