traceback 모듈이란

그림 1. traceback 예시 이미지  https://www.geeksforgeeks.org/python-traceback/

 

위 예시 이미지처럼 traceback의 출력 결과는 가장 마지막에 출력된 것이 가장 최근에 호출된 함수이다. 함수가 호출 될 때 마다 각 정보를 자료구조에 담아두고 함수의 호출 순서를 따라 차례대로 출력한다.

 

 

파이썬 프로그램의 스택 트레이스를 추출과 포매팅 그리고 프린팅하는 표준 인터페이스를 제공한다. 이 모듈은 traceback 객체를 사용하는데 sys.exc_info() 함수에서 반환값에서 얻거나 잡힌 예외의 __traceback__ 어트리뷰트로 접근할 수 있다. traceback 객체에는 tb_next, tb_frame, tb_lineno 등 다양한 어트리뷰트를 가지고 있으니 필요시 공식문서를 확인할 필요가 있다.

 

sys.exc_info() 설명 링크

 

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

https://www.geeksforgeeks.org/python-traceback/