Поймать исключение в asyncio gather

#python #asynchronous #exception #async-await

#python #асинхронный #исключение #асинхронный -ожидание

Вопрос:

Предположим, что есть несколько сопрограмм, которые мы отправляем в цикл событий

 task_list = [task1(), task2(), task3()]
res = asyncio.gather(*task_list, return_exceptions=True)
 

Что касается документации

Если значение return_exceptions равно True, исключения обрабатываются так же, как и успешные результаты, и агрегируются в списке результатов.

Т.е. если, например, task2 возвращает ошибку, результатом будет

 res = [task1_result, task2_error, task3_result]
 

Результат далее обрабатывается в другом процессе, и я хотел бы передать некоторое значение по умолчанию, если в ответе есть ошибка. Вопрос в том, как проверить наличие исключения в ответе event_loop. Что-то вроде (псевдокод предупреждения!)

 response = default if any(res is Error) else res
 

Ответ №1:

Вы можете использовать map функцию для замены ошибок в списке результатов значением по умолчанию. Для проверки, является ли результат ошибкой isinstance(result, Exception) , можно использовать. Вот так:

 task_list = [task1(), task2()]
res = await asyncio.gather(*task_list, return_exceptions=True)  # res = ["result", ArithmeticError()]
res = list(map(lambda r: r if not isinstance(r, Exception) else default_value, res))  # res = ["result", None]