2016-05-03 28 views

risposta

8

ensure_future - crea solo Task e torna immediatamente. Si dovrebbe attendere per attività creata per farlo è risultato (compreso caso quando si solleva eccezione):

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()) 

uscita:

ValueError('123',) 

Nel caso in cui non si ha intenzione di attendere immediatamente compito dopo averlo creato , si potrebbe attendere in un secondo momento (per sapere come è finita):

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)) 

uscita è lo stesso:

ValueError('123',) 
+0

Grazie. Sai anche come catturare le eccezioni con 'call_soon_threadsafe()'? –

+0

@MarcoSulla scusa, non lo so. Un modo che vedo è usare wrapper per gestire l'eccezione nel callback: http://pastebin.com/rNyTWMBk ma non so se è un modo comune per farlo. –