스택큐힙리스트

파이썬 "raise from" 사용법 본문

카테고리 없음

파이썬 "raise from" 사용법

스택큐힙리스트 2023. 4. 17. 02:29
반응형

파이썬에서 raise 와 raise from의 차이점은 무엇인가요?

try:

raise ValueError

except Exception as e:

raise IndexError

어떤 결과물을 보여줍니다.

Traceback (most recent call last):

File tmp.py, line 2, in

raise ValueError

ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File tmp.py, line 4, in

raise IndexError

IndexError

그리고

try:

raise ValueError

except Exception as e:

raise IndexError from e

어떤 결과를 보입니다.

Traceback (most recent call last):

File tmp.py, line 2, in

raise ValueError

ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

File tmp.py, line 4, in

raise IndexError from e

IndexError

답변 1

차이점은 m then 를 사용할 때, __cause__ 속성이 설정되고 예외가 직접적으로 발생하며 메시지가 그에 따라서 설정된다는 것입니다. 만약 m then 를 생략한다면, __cause__이 설정되지 않으며 대신에 __context__ 속성이 설정될 수 있고, 트레이스백은 다른 처리 중에 이루어진 상황을 나타낼 수 있습니다.

예외 처리기에서 anywher 를 사용했을 경우 __context__ 이 설정됩니다. 다른 곳에서 anywher 를 사용했을 경우에는 __context__ 이 설정되지 않습니다.

만약 __cause__ 이 설정되면 예외에도 __suppress_context__ = True 플래그가 설정됩니다. __suppress_context__ 가 True 으로 설정되면 traceback를 출력할 때 __context__ 이 무시됩니다.

예외 처리기에서 발생한 상황을 표시하고 싶지 않을 때 (다른 예외 처리 중에 발생한 메시지를 표시하지 않을 때) raise ... from None를 사용하여 __suppress_context__을 True로 설정하세요.

다른 말로 하면, 파이썬은 예외처리를 위한 문맥을 설정하여 예외가 발생한 위치를 내적으로 조사할 수 있어 다른 예외로 대체되었는지 확인할 수 있습니다. 또한 예외에 원인을 추가하여 추적 내역에서 다른 예외에 대한 명시적 정보를 선택할 수 있으며, 이때 문맥은 무시되지만 (디버그 중에는 내적으로 조사할 수 있음) raise ... from None을 사용하여 문맥을 출력하지 않도록 할 수 있습니다.

raise statement documenation 를 보세요.

from 절은 예외 체이닝에 사용됩니다. 만약 주어진 경우, 두 번째 표현식은 또 다른 예외 클래스나 인스턴스여야 하며, 그런 다음 해당 예외가 발생하면 쓰기 가능한 __cause__ 속성으로 발생한 예외에 첨부됩니다. 발생한 예외가 처리되지 않으면 두 예외 모두 출력됩니다.

>>> try:

... print(1 / 0)

... except Exception as exc:

... raise RuntimeError(Something bad happened) from exc

...

Traceback (most recent call last):

File , line 2, in

ZeroDivisionError: int division or modulo by zero

The above exception was the direct cause of the following exception:

Traceback (most recent call last):

File , line 4, in

RuntimeError: Something bad happened

같은 메커니즘이 암묵적으로 동작합니다. 예외 처리기나 finally 절 내에서 예외가 발생하는 경우: 이전 예외는 새로운 예외의 __context__ 속성으로 첨부됩니다.

>>> try:

... print(1 / 0)

... except:

... raise RuntimeError(Something bad happened)

...

Traceback (most recent call last):

File , line 2, in

ZeroDivisionError: int division or modulo by zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File , line 4, in

RuntimeError: Something bad happened

예외에 첨부된 컨텍스트 및 원인 정보에 대한 자세한 내용은 Built-in Exceptions documentation 에서도 확인해주세요.

답변 2

파이썬 raise from 사용 방법

raise from은 파이썬에서 예외 처리를 할 때 사용되는 기능입니다. 이 기능은 예외를 발생시킨 코드 블록 외부에서 예외 상황이 발생했거나 다른 예외 상황으로부터 예외를 표시할 때 사용됩니다.

예를 들어, 다음과 같은 함수가 있다고 가정해보겠습니다.

def calculate_discount(price, discount):

if discount < 0 or discount > 1:

raise ValueError('Discount must be between 0 and 1')

else:

discounted_price = price - (price * discount)

return discounted_price

이 함수는 할인율이 0~1 범위 안에 있는지 확인하는데, 할인율이 범위를 벗어나면 ValueError 예외를 발생시킵니다.

하지만 이 함수를 호출하는 코드에서 예외 처리가 되지 않았을 경우, raise from을 사용하여 더 나은 오류 메세지를 출력할 수 있습니다.

try:

calculate_discount(100, 2)

except ValueError as e:

raise ValueError('Error calculating discount') from e

위와 같이 raise from을 사용하면, Error calculating discount이라는 더 직관적인 오류 메세지가 출력됩니다.

또한 raise from을 사용하여 다른 예외 상황에서 발생한 예외를 처리할 수도 있습니다.

try:

test_file = open('non_existing_file.txt')

except FileNotFoundError as e:

raise ValueError('File not found') from e

위와 같이 파일이 존재하지 않을 때 발생하는 예외 상황을 ValueError로 잡아 처리할 수 있습니다.

raise from은 파이썬에서 예외 처리를 할 때 유용한 기능 중 하나입니다. 사용하여 더 나은 오류 메세지를 출력하고 예외 상황을 다른 예외 상황과 연결하여 처리할 수 있습니다.

반응형
Comments