TG Telegram Group & Channel
Zen of Python | United States America (US)
Create: Update:

except* | Зачем нужна звездочка?

Когда мы работаем с asyncio, может случиться так, что несколько задач выбрасывают ошибки одновременно.

До Python 3.11 ловилась только первая ошибка. Остальные — либо игнорировались, либо приходилось мучиться с обработкой.

С Python 3.11 ввели ExceptionGroup. Это контейнер для нескольких исключений.


ExceptionGroup(
[ValueError("Ошибка 1"), TypeError("Ошибка 2")]
)


Рассмотрим пример:


import asyncio

async def task1():
raise ValueError("Ошибка в task1")

async def task2():
raise TypeError("Ошибка в task2")

async def main():
try: # ловит ExceptionGroup
await asyncio.gather(task1(), task2()) # запускает обе задачи параллельно
except* ValueError as e: # перехватывает все ValueError из группы
for err in e.exceptions:
print(f"Перехвачено ValueError: {err}")
except* TypeError as e: # перехватывает все TypeError
for err in e.exceptions:
print(f"Перехвачено TypeError: {err}")

asyncio.run(main())

'''
Вывод:
Перехвачено ValueError: Ошибка в task1
Перехвачено TypeError: Ошибка в task2
'''


Подводные камни except*

- except* нельзя комбинировать с обычным except в одном обработчике (`except* ValueError as e, TypeError as e2` — так нельзя);
- except* работает только с ExceptionGroup — для обычных исключений он не нужен;

except* | Зачем нужна звездочка?

Когда мы работаем с asyncio, может случиться так, что несколько задач выбрасывают ошибки одновременно.

До Python 3.11 ловилась только первая ошибка. Остальные — либо игнорировались, либо приходилось мучиться с обработкой.

С Python 3.11 ввели ExceptionGroup. Это контейнер для нескольких исключений.


ExceptionGroup(
[ValueError("Ошибка 1"), TypeError("Ошибка 2")]
)


Рассмотрим пример:


import asyncio

async def task1():
raise ValueError("Ошибка в task1")

async def task2():
raise TypeError("Ошибка в task2")

async def main():
try: # ловит ExceptionGroup
await asyncio.gather(task1(), task2()) # запускает обе задачи параллельно
except* ValueError as e: # перехватывает все ValueError из группы
for err in e.exceptions:
print(f"Перехвачено ValueError: {err}")
except* TypeError as e: # перехватывает все TypeError
for err in e.exceptions:
print(f"Перехвачено TypeError: {err}")

asyncio.run(main())

'''
Вывод:
Перехвачено ValueError: Ошибка в task1
Перехвачено TypeError: Ошибка в task2
'''


Подводные камни except*

- except* нельзя комбинировать с обычным except в одном обработчике (`except* ValueError as e, TypeError as e2` — так нельзя);
- except* работает только с ExceptionGroup — для обычных исключений он не нужен;
👍142


>>Click here to continue<<

Zen of Python




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)