새 모양 (3.11+) — 비행 중 여러 예외
Python 3.11 까진 예외 raise + 잡기가 엄격히 직렬 — 한 번에 하나. 근데 동시성 코드 — asyncio 의 TaskGroup, 병렬 I/O, 배치 연산 — 가끔 동시에 여러 개 실패. ExceptionGroup 이 언어의 답 — 다른 거들의 list 감싸는 단일 예외, except* 가 그룹 안 특정 타입 처리 새 문법.
ExceptionGroup — 예외 list 감쌈
ExceptionGroup(message, list_of_excs) raise. 그룹 자체가 예외, 구성 예외들이 .exceptions 로 접근 가능. traceback 이 전체 트리 보여.
except* — 타입 잡고 나머지 두기
except* SomeError as eg: 가 그룹 안의 모든 SomeError 잡음, 중첩 깊이 무관. 바인딩된 eg 가 매치된 거만 담은 *새* ExceptionGroup. 원래 그룹의 다른 예외는 계속 전파, 여러 except* 블록이 각자 자기 타입 잡음.
asyncio.TaskGroup — 처음 만나는 곳
실제 코드에서 ExceptionGroup 의 가장 흔한 생산자는 asyncio.TaskGroup (3.11+). 여러 task 가 동시 실패하면 그룹이 모든 예외 한 ExceptionGroup 으로 묶음. 처리 — try: async with TaskGroup() as tg: ...; except* OneType as eg: ...; except* OtherType as eg: ....
원칙: 대부분 애플리케이션 코드는 ExceptionGroup 직접 구축 안 필요. 주로
TaskGroup 또는 다른 동시성 primitive 쓸 때 만나. except* 문법 알면 다중 실패 케이스 깔끔히 처리.