중첩된 시도/제외 블록에서 예외를 다시 발생시키는 방법은 무엇입니까?
예외를 다시 제기하려면 간단히 사용할 수 있습니다.raise
각각의 논쟁 없이.except
블록. 하지만 다음과 같은 중첩된 표현이 주어지면.
try:
something()
except SomeError as e:
try:
plan_B()
except AlsoFailsError:
raise e # I'd like to raise the SomeError as if plan_B()
# didn't raise the AlsoFailsError
어떻게 하면 다시 올릴 수 있습니까?SomeError
스택 추적을 끊지 않고요? raise
이 경우에만 더 최근의 것을 다시 확인할 수 있습니다.AlsoFailsError
또는 코드를 리팩터링하여 이 문제를 방지하려면 어떻게 해야 합니까?
파이썬 3부터는 예외에 트레이스백이 저장되기 때문에 간단한raise e
옳은 일을 할 것입니다.
try:
something()
except SomeError as e:
try:
plan_B()
except AlsoFailsError:
raise e # or raise e from None - see below
생성된 추적에는 다음과 같은 추가 통지가 포함됩니다.SomeError
처리 중 발생했습니다.AlsoFailsError
(때문에)raise e
안에 있는 것except AlsoFailsError
) 실제로 일어난 일은 반대이기 때문에 오해의 소지가 있습니다. - 우리는 마주쳤습니다.AlsoFailsError
그리고 그것을 처리했고, 회복하려고 노력했습니다.SomeError
다음을 포함하지 않는 추적을 가져오려면AlsoFailsError
,교체하다raise e
와 함께raise e from None
.
Python 2에서는 예외 유형, 값 및 트레이스백을 로컬 변수에 저장하고 다음의 세 가지 인수 형식을 사용합니다.
try:
something()
except SomeError:
t, v, tb = sys.exc_info()
try:
plan_B()
except AlsoFailsError:
raise t, v, tb
수락된 솔루션이 맞더라도 를 사용하여 파이썬 2+3 솔루션이 있는 Six 라이브러리를 가리키면 좋습니다.
6.reaise(exc_type, exc_value, exc_traceback=임시)
다른 추적을 사용하여 예외를 다시 발생시킵니다. [...]
따라서 다음과 같이 쓸 수 있습니다.
import six
try:
something()
except SomeError:
t, v, tb = sys.exc_info()
try:
plan_B()
except AlsoFailsError:
six.reraise(t, v, tb)
드류 맥고웬의 제안에 따르면, 그러나 일반적인 경우를 처리하는 것(수익 가치가 있는 경우).s
있음), 다음은 사용자 4815162342의 답변에 대한 대안입니다.
try:
s = something()
except SomeError as e:
def wrapped_plan_B():
try:
return False, plan_B()
except:
return True, None
failed, s = wrapped_plan_B()
if failed:
raise
Python 3.5+는 추적 정보를 오류에 첨부하므로 더 이상 별도로 저장할 필요가 없습니다.
>>> def f():
... try:
... raise SyntaxError
... except Exception as e:
... err = e
... try:
... raise AttributeError
... except Exception as e1:
... raise err from None
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 9, in f
File "<stdin>", line 3, in f
SyntaxError: None
>>>
언급URL : https://stackoverflow.com/questions/18188563/how-to-re-raise-an-exception-in-nested-try-except-blocks
'code' 카테고리의 다른 글
접두사/접미사를 사용하여 이름을 변경하는 방법은 무엇입니까? (0) | 2023.06.27 |
---|---|
Express에서 "다음" 매개 변수는 무엇에 사용됩니까? (0) | 2023.06.22 |
하나의 라이너: 인덱스를 키로 하는 목록에서 사전 만들기 (0) | 2023.06.22 |
Eplus를 사용하여 Excel에서 행(데이터 포함, 병합, 스타일 포함)을 복사할 수 있습니까? (0) | 2023.06.22 |
몽고드브를 시작할 수 없는 이유는 무엇입니까? (0) | 2023.06.22 |