파이썬 예외를 다시 던지는 중입니다.어느 것을 잡을 것인가?
문제
저는 파이썬을 사용하는 법을 배우고 있습니다.방금 다음 기사를 접했습니다.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에 의해 던져진 예외 때문에 실행되지 않습니다.또한 파이썬 예외에서 "우선 순위"에 대한 아이디어가 있음을 믿지 않습니다.