Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 3에서 예외 체인(Exception Chaining)을 사용하는 표준 방법

예외 체인이란 무엇인가?

하나의 예외 'A'를 처리하는 도중에 또 다른 예외 'B'가 발생할 수 있습니다. Python 2에서는 이런 상황이 발생하면 예외 B만 외부로 전파되고 예외 A는 사라져 버립니다. 하지만 문제를 효과적으로 디버깅하려면 두 예외 모두에 대한 정보를 파악하는 것이 매우 유용합니다.

__cause__ 속성으로 원인 명시하기

때때로 예외 핸들러에서 의도적으로 예외를 다시 발생(re-raise)시키는 것이 도움이 됩니다. 추가 정보를 제공하거나, 한 예외를 다른 타입의 예외로 변환하기 위해서입니다. 이때 __cause__ 속성은 예외의 직접적인 원인을 명시적으로 기록하는 표준적인 방법을 제공합니다.

Python 3의 raise ... from 절

예외 체인은 Python 3부터 지원되며, raise ... from 절을 통해 구현할 수 있습니다. 기존 코드를 raise ... from 절로 재작성하면 다음과 같습니다.

try:
    s = {'a':1, 'b':2}['c']
except KeyError as e:
    raise ValueError('failed') from e

실행 결과 확인하기

Python 3는 기본적으로 예외 처리 과정에서 발생한 모든 예외를 순차적으로 보여줍니다.

Traceback (most recent call last):
  File "source_file.py", line 2, in <module>
    s = {'a':1, 'b':2}['c']
KeyError: 'c'

이어서 "위 예외가 다음 예외의 직접적인 원인임"을 알리는 메시지와 함께 두 번째 예외가 출력됩니다.

Traceback (most recent call last):
  File "source_file.py", line 4, in <module>
    raise ValueError('failed') from e
ValueError: failed

명시적 체인과 암묵적 체인의 차이

raise ... from을 사용하면 __cause__ 속성이 설정되고 "직접적인 원인(direct cause)"이라는 메시지가 표시됩니다. 반면 from 없이 except 블록 안에서 새 예외를 발생시키면 __context__ 속성을 통한 암묵적 체인이 적용되어 "처리 중에 다른 예외가 발생했습니다"라는 메시지가 나타납니다. 만약 원래 예외의 정보를 완전히 숨기고 싶다면 raise ValueError('failed') from None처럼 None을 지정하면 됩니다.