traceback 모듈이란
위 예시 이미지처럼 traceback의 출력 결과는 가장 마지막에 출력된 것이 가장 최근에 호출된 함수이다. 함수가 호출 될 때 마다 각 정보를 자료구조에 담아두고 함수의 호출 순서를 따라 차례대로 출력한다.
파이썬 프로그램의 스택 트레이스를 추출과 포매팅 그리고 프린팅하는 표준 인터페이스를 제공한다. 이 모듈은 traceback 객체를 사용하는데 sys.exc_info() 함수에서 반환값에서 얻거나 잡힌 예외의 __traceback__ 어트리뷰트로 접근할 수 있다. traceback 객체에는 tb_next, tb_frame, tb_lineno 등 다양한 어트리뷰트를 가지고 있으니 필요시 공식문서를 확인할 필요가 있다.
import sys
import traceback
# 예외를 발생시키는 함수 정의
def raise_exception():
x = 1 / 0
try:
raise_exception()
except ZeroDivisionError:
# exc_traceback = sys.exception() # 3.11부터 sys.exception()으로도 exception instance를 가져올 수 있음
_, _, exc_traceback = sys.exc_info()
print(f"traceback: \n {traceback.format_exc()}")
traceback.print_tb(exc_traceback, limit=None) # limit=1로 설정하면 호출 스택의 최상위 1개만 출력
- 보통 traceback은 프로그램이 종료하였을 때 출력되게 되는데 try, except에서 traceback을 호출하게 되면 프로그램을 종료시키지 않고도 traceback을 확인할 수 있다.
- traceback.format_exc()와 traceback.print_tb의 결과는 똑같다. 그러나 traceback.print_tb의 limt변수를 조정함으로 호출스택의 출력 개수를 정할 수 있다.
traceback 모듈에서 사용 가능한 함수
__all__ = ['extract_stack', 'extract_tb', 'format_exception',
'format_exception_only', 'format_list', 'format_stack',
'format_tb', 'print_exc', 'format_exc', 'print_exception',
'print_last', 'print_stack', 'print_tb', 'clear_frames',
'FrameSummary', 'StackSummary', 'TracebackException',
'walk_stack', 'walk_tb']
해당 모듈에 들어가면 접근 가능한 모듈에 대해 __all__변수로 공개되어있다. 각 설명을 읽어보고 필요할 때 맞추어 사용하면 될 것 같다. traceback.print_tb의 사용도 __all__리스트 내용을 보고 사용해보았다. 파이썬 버전에 맞추어 traceback example을 참고하면 될 것 같다.
참고자료
https://docs.python.org/ko/3.10/library/traceback.html
https://ctkim.tistory.com/entry/python-sys-%EB%AA%A8%EB%93%88
https://docs.python.org/ko/3.10/reference/datamodel.html#traceback-objects
https://daco2020.tistory.com/570
https://docs.python.org/ko/3.10/library/traceback.html#traceback-examples
'Python 관련 > Python' 카테고리의 다른 글
[Python, Docker] Docker container에서 pip로 패키지 설치가 안될 때 (0) | 2024.06.25 |
---|---|
[Python] yaml 사용 방법 (0) | 2024.05.05 |
[Python] sys.exc_info() 사용법과 이해 (0) | 2024.05.02 |