PHpullh

PYTHON · 예외처리

예외 체이닝

raise ... from으로 예외를 체이닝하여 원인과 결과를 명확히 연결합니다.

예외처리중급exception chaining예외 체이닝from__cause__

핵심 설명

raise ... from으로 예외를 체이닝하여 원인과 결과를 명확히 연결합니다.

Python code

# 명시적 예외 체이닝
class DatabaseError(Exception):
    pass

class UserNotFoundError(Exception):
    pass

def get_user(user_id: int) -> dict:
    try:
        # 데이터베이스 조회 시뮬레이션
        if user_id < 0:
            raise ValueError(f"잘못된 ID: {user_id}")
        if user_id > 100:
            raise ConnectionError("DB 연결 실패")
        return {"id": user_id, "name": f"User-{user_id}"}
    except ValueError as e:
        raise UserNotFoundError(f"사용자 {user_id} 없음") from e
    except ConnectionError as e:
        raise DatabaseError("데이터베이스 오류") from e

# 체이닝된 예외 확인
try:
    get_user(-1)
except UserNotFoundError as e:
    print(f"에러: {e}")
    print(f"원인: {e.__cause__}")

# 체이닝 억제: from None
def safe_parse(text: str) -> int:
    try:
        return int(text)
    except ValueError:
        raise ValueError(f"'{text}'는 숫자가 아닙니다") from None

try:
    safe_parse("abc")
except ValueError as e:
    print(f"에러: {e}")
    print(f"원인: {e.__cause__}")  # None

학습 팁

from None을 사용하면 원래 예외를 숨겨 에러 메시지를 깔끔하게 만들 수 있습니다.

주의할 점

raise만 사용하면 암시적 체이닝(__context__)이 됩니다. 의도적 체이닝은 from을 명시하세요.

자주 묻는 질문

예외 체이닝란 무엇인가요?

raise ... from 으로 예외를 체이닝하여 원인과 결과를 명확히 연결합니다.

예외 체이닝 학습 시 주의할 점은 무엇인가요?

raise 만 사용하면 암시적 체이닝( __context__ )이 됩니다. 의도적 체이닝은 from 을 명시하세요.