일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래밍
- 딥러닝
- 네트워크
- 코딩
- 웹개발
- 버전관리
- 컴퓨터공학
- 컴퓨터비전
- 클라우드컴퓨팅
- 컴퓨터과학
- 데이터구조
- 사이버보안
- 소프트웨어
- Yes
- 데이터분석
- 빅데이터
- 파이썬
- 자바스크립트
- 머신러닝
- 2
- 알고리즘
- 프로그래밍언어
- 보안
- 데이터과학
- 인공지능
- I'm Sorry
- 자료구조
- 네트워크보안
- 소프트웨어공학
- 데이터베이스
- Today
- Total
스택큐힙리스트
파이썬 "raise from" 사용법 본문
파이썬에서 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
ZeroDivisionError: int division or modulo by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File
RuntimeError: Something bad happened
같은 메커니즘이 암묵적으로 동작합니다. 예외 처리기나 finally 절 내에서 예외가 발생하는 경우: 이전 예외는 새로운 예외의 __context__ 속성으로 첨부됩니다.
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError(Something bad happened)
...
Traceback (most recent call last):
File
ZeroDivisionError: int division or modulo by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File
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은 파이썬에서 예외 처리를 할 때 유용한 기능 중 하나입니다. 사용하여 더 나은 오류 메세지를 출력하고 예외 상황을 다른 예외 상황과 연결하여 처리할 수 있습니다.