문제

저는 파이썬을 사용하는 법을 배우고 있습니다.방금 다음 기사를 접했습니다.http://nedbatchelder.com/blog/200711/rethrowing_Exceptions_in_python.html다음과 같이 Python에서 예외를 다시 던지는 방법을 설명합니다.

try:
    do_something_dangerous()
except:
    do_something_to_apologize()
    raise

예외를 다시 발생시키므로 "외부 catch-제외" 문이 있어야 합니다.하지만 지금은 생각하고 있었어요.Except 내부의 do_something_to_apologize()가 오류를 발생시키면 어떻게 될까요?외부의 "catch-제외"에는 어느 것이 걸리나요?다시 던지는 것인가요, 아니면 do_something_to_apologize() 에 의해 던진 것인가요?아니면 우선순위가 가장 높은 예외를 먼저 포착할 것인가?

도움이 되었습니까?

해결책

그것을 시도하고 참조하십시오:

def failure():
    raise ValueError, "Real error"

def apologize():
    raise TypeError, "Apology error"

try:
    failure()
except ValueError:
    apologize()
    raise

결과:

Traceback (most recent call last):
  File "<pyshell#14>", line 10, in <module>
    apologize()
  File "<pyshell#14>", line 5, in apologize
    raise TypeError, "Apology error"
TypeError: Apology error

이유:원래 함수의 "실제" 오류는 이미 발견되었습니다. except. apologize 새로운 오류가 발생합니다 전에 raise 도달했다.그러므로, raise 에서 except 조항은 실행되지 않으며 사과의 오류만 위쪽으로 전파됩니다.만약에 apologize 오류가 발생하면 Python은 이후에 다른 예외가 발생할지 알 수 없습니다. apologize.

Python 3에서는 추적에서 다음을 언급합니다. 둘 다 두 번째 예외가 어떻게 발생했는지 설명하는 메시지와 함께 예외가 발생했습니다.

Traceback (most recent call last):
  File "./prog.py", line 9, in <module>
  File "./prog.py", line 2, in failure
ValueError: Real error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./prog.py", line 11, in <module>
  File "./prog.py", line 5, in apologize
TypeError: Apology error

그러나 두 번째 예외("사과" 예외)는 여전히 외부로 전파되고 더 높은 수준에서 발견될 수 있는 유일한 예외입니다. except 절.원래 예외는 역추적에 언급되어 있지만 이후 예외에 포함되어 더 이상 포착될 수 없습니다.

다른 팁

do_something_to_aprice ()에 의해 throw되는 예외가 붙어 있습니다.인상이 포함 된 라인은 do_something_to_pop에 의해 던져진 예외 때문에 실행되지 않습니다.또한 파이썬 예외에서 "우선 순위"에 대한 아이디어가 있음을 믿지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top