Catch errors in asyncio.ensure_future

前端 未结 1 1977
梦毁少年i
梦毁少年i 2020-12-29 12:34

I have this code:

try:
    asyncio.ensure_future(data_streamer.sendByLatest())
except ValueError as e:
    logging.debug(repr(e))

dat

相关标签:
1条回答
  • 2020-12-29 13:11

    ensure_future - just creates Task and return immediately. You should await for created task to get it's result (including case when it raises exception):

    import asyncio
    
    
    async def test():
        await asyncio.sleep(0)
        raise ValueError('123')
    
    
    async def main():    
        try:
            task = asyncio.ensure_future(test())  # Task aren't finished here yet 
            await task  # Here we await for task finished and here exception would be raised 
        except ValueError as e:
            print(repr(e))
    
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(main())
    

    Output:

    ValueError('123',)
    

    In case you aren't planning to await task immediately after you created it, you can await it later (to know how it has finished):

    async def main():    
        task = asyncio.ensure_future(test())
        await asyncio.sleep(1)
        # At this moment task finished with exception,
        # but we didn't retrieved it's exception.
        # We can do it just awaiting task:
        try:
            await task  
        except ValueError as e:
            print(repr(e)) 
    

    Output is same:

    ValueError('123',)
    
    0 讨论(0)
提交回复
热议问题