[python] 파이썬은 “모금”사용법

파이썬 raiseraise 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__속성이 설정되어 있고 메시지는 예외가되었다는 내용 을 직접 발생 . 생략하면 fromno __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

또한 컨텍스트에 대한 자세한 내용과 예외에 첨부 된 정보 는 내장 예외 문서 를 참조하십시오.


답변