파이썬 raise
과 raise from
파이썬 의 차이점은 무엇입니까 ?
try:
raise ValueError
except Exception as e:
raise IndexError
생산량
Traceback (most recent call last):
File "tmp.py", line 2, in <module>
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "tmp.py", line 4, in <module>
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 <module>
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 <module>
raise IndexError from e
IndexError
답변
차이점은 사용하는 경우이다 from
는 __cause__
속성이 설정되어 있고 메시지는 예외가되었다는 내용 을 직접 발생 . 생략하면 from
no __cause__
가 설정되지만 __context__
속성 도 설정 될 수 있으며 추적은 다른 상황을 처리 하는 동안 컨텍스트를 표시합니다 .
예외 처리기에서 __context__
사용한 경우 발생 설정 raise
; raise
다른 곳에서 사용 하면 no __context__
도 설정됩니다.
a __cause__
가 설정되면 __suppress_context__ = True
예외에서도 플래그가 설정됩니다. 경우 __suppress_context__
에 설정 True
의는 __context__
역 추적을 인쇄 할 때 무시됩니다.
컨텍스트를 표시 하지 않으려 는 예외 핸들러 ( 다른 예외 발생 메시지를 처리 하는 동안 원하지 않음 )에서 발생하는 경우을 사용 raise ... from None
하여로 설정 __suppress_context__
하십시오 True
.
다시 말해, 파이썬은 예외에 대한 컨텍스트 를 설정 하므로 예외가 발생한 위치를 조사하여 다른 예외가 대체되었는지 확인할 수 있습니다. 또한 예외에 원인 을 추가 하여 다른 예외에 대해 트레이스 백을 명시 적으로 만들 수 있으며 (다른 표현 사용) 컨텍스트는 무시되지만 디버깅 할 때 여전히 검사 할 수 있습니다. 사용 raise ... from None
하면 인쇄중인 컨텍스트를 억제 할 수 있습니다.
raise
진술 문서를 참조하십시오 :
이
from
절은 예외 체인에 사용됩니다. 제공되는 경우 두 번째 표현식 은 또 다른 예외 클래스 또는 인스턴스 여야하며,__cause__
속성 으로 작성된 예외에 첨부됩니다 (쓰기 가능). 발생한 예외가 처리되지 않으면 두 가지 예외가 모두 인쇄됩니다.>>> try: ... print(1 / 0) ... except Exception as exc: ... raise RuntimeError("Something bad happened") from exc ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
예외 처리기 또는
finally
절 에서 예외가 발생하면 유사한 메커니즘이 암시 적으로 작동합니다 . 그런 다음 이전 예외가 새 예외의__context__
특성 으로 첨부됩니다 .>>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
또한 컨텍스트에 대한 자세한 내용과 예외에 첨부 된 정보 는 내장 예외 문서 를 참조하십시오.