コルーチンの結果をどこかで待つ必要があり、そのコンテキストで例外が発生します。すべてのコルーチンは「待たれている」必要があります。 asyncio.run_until_complete()
はそれを暗黙のうちに行いますが、run_forever()
は実行できないので、永遠に実行することはできません。以下は、例外を(Python 3.5の構文を使用して)どのように見ることができるかの例です:
>>> import asyncio
>>> import traceback
>>> async def f():
... raise Exception("Viva la revolución!")
...
>>> task_f = asyncio.ensure_future(f())
>>> async def g():
... try:
... await task_f
... except Exception:
... traceback.print_exc()
...
>>> task_g = asyncio.ensure_future(g())
>>> asyncio.get_event_loop().run_forever()
Traceback (most recent call last):
File "<ipython-input-5-0d9e3c563e35>", line 3, in g
await task_f
File "/usr/lib/python3.5/asyncio/futures.py", line 363, in __iter__
return self.result() # May raise too.
File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
raise self._exception
File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
result = coro.send(None)
File "<ipython-input-3-928dc548dc3e>", line 2, in f
raise Exception("Viva la revolución!")
Exception: Viva la revolución!
a + Viva la revolucion。 –