프로그래밍 언어/Python

Python에서 프로그램을 중지 / 종료하지 않고 전체 예외 추적을 포착하고 출력하는 방법

Rateye 2021. 7. 5. 10:28
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
반응형