Только что было упомянуто: asyncio.Task
объекты имеют методы result
и exception
.
result
[...] если сопрограмма вызвала исключение, это исключение
поднятый [...]
exception
:
[...] Если завернутая сопрограмма вызвала исключение, это исключение
вернулся [...]
При простой настройке (в синтаксисе Python 3.7):
import asyncio
tasks =[]
async def bad_test():
raise ValueError
async def good_test():
return
async def main():
tasks.append(asyncio.create_task(bad_test()))
tasks.append(asyncio.create_task(good_test()))
asyncio.run(main())
Используя result
, можно сделать:
for t in tasks:
try:
f = t.result()
except ValueError as e:
logger.exception("we're all doomed")
Или, используя exception
:
for t in tasks:
if isinstance(t.exception(), Exception):
logger.exception("apocalypse now")
Однако оба метода требуют выполнения Task
, в противном случае:
Если задача была отменена, этот метод вызывает CancelledError
исключение.
( результат ): если результат Задачи еще не доступен, этот метод вызывает
Исключение InvalidStateError.
( исключение ): если Задача еще не выполнена, этот метод вызывает исключение InvalidStateError.
Таким образом, в отличие от предложения в другом ответе, регистрация не будет происходить при возникновении исключений в задачах, а скорее, когда задачи оцениваются после их завершения.