본문 바로가기
C.W.K.
Stream
Lesson 06 of 06 · published

ExceptionGroup과 except* — 여러 실패를 함께 다루기

~18 min · exceptiongroup, except-star, 3.11, asyncio

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

동시에 시작한 작업은 함께 실패할 수 있어

Python 3.11의 ExceptionGroup은 여러 예외를 하나의 트리로 묶고, except*는 그 안에서 특정 타입에 해당하는 모든 잎을 골라 처리해. 실제로는 asyncio.TaskGroup 같은 구조적 동시성에서 자주 만나.

처리하지 않은 예외는 다시 묶여 올라간다

한 except*가 그룹 일부를 처리해도 나머지는 사라지지 않아. 여러 except*가 각 타입을 나눠 맡을 수 있고, 중첩 구조도 보존돼. 같은 try에 평범한 except와 섞을 수는 없어.

원칙: 첫 오류 하나만 보는 직렬 사고를 버리고, 동시에 실패한 각 작업에 어떤 복구를 적용할지 정해.

Code

ExceptionGroup을 만들고 타입별로 처리하기·python
# Python 3.11+
try:
    raise ExceptionGroup(
        "여러 문제",
        [
            ValueError("잘못된 값"),
            KeyError("없음"),
            TypeError("잘못된 모양"),
        ],
    )
except* ValueError as eg:
    print("value 에러 잡음:", [str(e) for e in eg.exceptions])
except* KeyError as eg:
    print("key 에러 잡음:", [str(e) for e in eg.exceptions])
# 원래 그룹의 TypeError 는 위로 전파 — 둘 다 except* 에 안 매치
TaskGroup에서 모인 여러 실패·python
# import asyncio
#
# async def fail_a():
#     raise ValueError("a 실패")
#
# async def fail_b():
#     raise KeyError("b 실패")
#
# async def main():
#     try:
#         async with asyncio.TaskGroup() as tg:
#             tg.create_task(fail_a())
#             tg.create_task(fail_b())
#     except* ValueError as eg:
#         print("value 에러:", [str(e) for e in eg.exceptions])
#     except* KeyError as eg:
#         print("key 에러:", [str(e) for e in eg.exceptions])
#
# asyncio.run(main())
# 두 task 동시 실행, 두 실패 그룹에 수집, 둘 다 처리.
중첩 그룹에서도 같은 타입 고르기·python
try:
    raise ExceptionGroup(
        "바깥",
        [
            ValueError("v1"),
            ExceptionGroup("안", [ValueError("v2"), KeyError("k1")]),
        ],
    )
except* ValueError as eg:
    print("모든 ValueError:", [str(e) for e in eg.exceptions])
    # v1 (top level) 와 v2 (중첩) 둘 다 — except* 가 재귀
except* KeyError as eg:
    print("모든 KeyError:", [str(e) for e in eg.exceptions])
그룹 문법이 없는 직렬 처리와 비교·python
# 3.11 없거나 옛 스타일 처리 원하면
try:
    raise ExceptionGroup("문제", [ValueError("x"), KeyError("y")])
except ExceptionGroup as eg:
    for e in eg.exceptions:
        print("개별:", type(e).__name__, e)
# 작동하지만 중첩은 처리하지 못함 — 그건 except* 필요

External links

Exercise

ValueError, KeyError, 그리고 TypeError와 두 번째 ValueError를 담은 중첩 그룹으로 ExceptionGroup을 만들어. except*로 모든 ValueError와 모든 KeyError를 각각 처리하고, 중첩된 ValueError도 같은 분기에 들어오는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.