728x90
반응형
질문 : 프로그램을 중지 / 종료하지 않고 전체 예외 추적을 포착하고 출력하는 방법은 무엇입니까?
종료하지 않고 예외를 포착하고 기록하고 싶습니다.
try:
do_stuff()
except Exception, err:
print(Exception, err)
# I want to print the entire traceback here,
# not just the exception name and details
나는 예외가 예외를 인터셉트 try..except없이 발생할 때 내용을 출력하려면, 나는 내 프로그램을 종료하지 않습니다. 어떻게해야합니까?
답변
다른 답변은 이미 traceback 모듈을 지적했습니다.
print_exc
하면 일부 모퉁이의 경우 예상 한 것을 얻지 못할 수 있습니다. Python 2.x에서 :
import traceback
try:
raise TypeError("Oups!")
except Exception, err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_exc()
... 마지막 예외의 역 추적을 표시합니다.
Traceback (most recent call last):
File "e.py", line 7, in <module>
raise TypeError("Again !?!")
TypeError: Again !?!
원래 역 추적 에 액세스해야하는 경우 한 가지 해결책은 exc_info
에서 반환 된 예외 정보 를 캐시하고 print_exception을 사용하여 표시하는 print_exception
.
import traceback
import sys
try:
raise TypeError("Oups!")
except Exception, err:
try:
exc_info = sys.exc_info()
# do you usefull stuff here
# (potentially raising an exception)
try:
raise TypeError("Again !?!")
except:
pass
# end of useful stuff
finally:
# Display the *original* exception
traceback.print_exception(*exc_info)
del exc_info
생산 :
Traceback (most recent call last):
File "t.py", line 6, in <module>
raise TypeError("Oups!")
TypeError: Oups!
그래도 몇 가지 함정이 있습니다.
sys_info
의 문서에서 :예외를 처리하는 함수의 지역 변수에 역 추적 반환 값을 할당하면 순환 참조 가 발생합니다. 이렇게하면 동일한 함수의 로컬 변수 또는 트레이스 백이 참조하는 항목이 가비지 수집되는 것을 방지 할 수 있습니다. [...] 트레이스 백이 필요한 경우 사용 후 삭제해야합니다 (try ... finally 문을 사용하는 것이 가장 좋습니다).- 그러나 동일한 문서에서 :Python 2.2부터 이러한주기는 가비지 수집이 활성화되고 도달 할 수 없게되면 자동으로 회수되지만주기 생성을 피하는 것이 더 효율적입니다.
sys_info
의 문서에서 :예외를 처리하는 함수의 지역 변수에 역 추적 반환 값을 할당하면 순환 참조 가 발생합니다. 이렇게하면 동일한 함수의 로컬 변수 또는 트레이스 백이 참조하는 항목이 가비지 수집되는 것을 방지 할 수 있습니다. [...] 트레이스 백이 필요한 경우 사용 후 삭제해야합니다 (try ... finally 문을 사용하는 것이 가장 좋습니다).
반면에 예외와 관련된 트레이스 백에 액세스 할 수 있도록 허용함으로써 Python 3는 덜 놀라운 결과를 생성합니다.
import traceback
try:
raise TypeError("Oups!")
except Exception as err:
try:
raise TypeError("Again !?!")
except:
pass
traceback.print_tb(err.__traceback__)
... 표시됩니다 :
File "e3.py", line 4, in <module>
raise TypeError("Oups!")
출처 : https://stackoverflow.com/questions/3702675/how-to-catch-and-print-the-full-exception-traceback-without-halting-exiting-the
728x90
반응형
'프로그래밍 언어 > Python' 카테고리의 다른 글
pip로 모든 Python 패키지를 업그레이드하는 방법 (0) | 2021.07.08 |
---|---|
.whl 파일이있는 Python 패키지를 설치하는 법 (0) | 2021.07.08 |
Python에 디렉토리가 있는지 확인하는 방법 (0) | 2021.07.02 |
Python으로 단위 테스트 작성하는 방법 (0) | 2021.07.01 |
arr .__ len __ ()은 파이썬에서 배열의 길이를 얻는 데 선호되는 방법 (0) | 2021.07.01 |