#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]