Suppose I have a few coroutines running in a loop. How to make so that if some of them failed with exception the whole program would fail with this exception? Because right now asyncio doesn't even prints the error messages from coroutines unless I use logging level "DEBUG".
from asyncio import get_event_loop, sleep
async def c(sleep_time=2, fail=False):
print('c', sleep_time, fail)
if fail:
raise Exception('fail')
while True:
print('doing stuff')
await sleep(sleep_time)
loop = get_event_loop()
loop.create_task(c(sleep_time=10, fail=False))
loop.create_task(c(fail=True))
loop.run_forever()
A graceful way is using error handling api.
https://docs.python.org/3/library/asyncio-eventloop.html#error-handling-api
Example:
import asyncio
async def run_division(a, b):
await asyncio.sleep(2)
return a / b
def custom_exception_handler(loop, context):
# first, handle with default handler
loop.default_exception_handler(context)
exception = context.get('exception')
if isinstance(exception, ZeroDivisionError):
print(context)
loop.stop()
loop = asyncio.get_event_loop()
# Set custom handler
loop.set_exception_handler(custom_exception_handler)
loop.create_task(run_division(1, 0))
loop.run_forever()