У меня есть приложение aiohttp, и запрос вызывает (поддельное!) Исключение:
ERROR:aiohttp.server:Error handling request
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\aiohttp\web_protocol.py", line 418, in start
resp = await task
File "C:\Program Files\Python36\lib\site-packages\aiohttp\web_app.py", line 458, in _handle
resp = await handler(request)
File "webservice.py", line 60, in handle_status
raise ValueError('*******************')
Я жду ~ 2 минуты и закрываю приложение через CTRL + C.Это вызывает `KeyboardInterrupt". Внутри обработчика исключений запускается следующий код.
def close_loop(loop):
""" Gracefully close down the event loop.
"""
# Log any excepting tasks using the usual logging module.
tasks = asyncio.Task.all_tasks(loop=loop)
exceptions = [(task, task.exception()) for task in tasks if task.done()]
exceptions = [(task, err) for task, err in exceptions if err]
for task, err in exceptions:
log.error(f'close_loop reports exception:\n\t{task}\n\t{err}')
# Handle shutdown gracefully by waiting for all tasks to be cancelled.
log.debug(f'close_loop: gathering tasks: {tasks}')
tasks = asyncio.gather(*tasks, loop=loop, return_exceptions=True)
tasks.add_done_callback(lambda task: loop.stop())
tasks.cancel()
# Keep the event loop running until it is either destroyed or all
# tasks have really terminated.
log.debug('close_loop: wait for cancellation')
while not tasks.done() and not loop.is_closed():
loop.run_forever()
Затем в журнал записываются исключения, сделанные на 2 минуты раньше. См. Ниже.
ERROR:mymodule.run:\close_loop reports exception:
<Task finished coro=<Application._handle() done, defined at C:\Program Files\Python36\lib\site-packages\aiohttp\web_app.py:428> exception=ValueError('*******************',)>
*******************
Я бы предпочел регистрировать и приводить в порядок эти исключения во время работы приложения. Мне не нравится идея, что куча этих исключений будет накапливаться в памяти до тех пор, пока приложение не существует.
Что лучшепрактика для решения исключительных задач, торчащих в asyncio? Это поведение определено где-нибудь?