code

중첩된 시도/제외 블록에서 예외를 다시 발생시키는 방법은 무엇입니까?

starcafe 2023. 6. 22. 22:06
반응형

중첩된 시도/제외 블록에서 예외를 다시 발생시키는 방법은 무엇입니까?

예외를 다시 제기하려면 간단히 사용할 수 있습니다.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

반응형