본문 바로가기
Python

traceback (파이썬 모듈)

by yororing 2024. 7. 10.

00 개요

  • 목적: 코드 분석 중 traceback 을 import하길래 뭐에 사용하는 것인지 정리하고자함

01 traceback 모듈

1. 정의

  • Stack Trace (Stack Traceback - 컴퓨터의 내부 처리 작업에 대한 보고)을 출력하거나 가져오는 기능을 제공하는 모듈
  • Python 프로그램의 Stack Trace를 추출, 형식화 및 출력하기 위한 표준 인터페이스 제공
  • 이는 Python 인터프리터가 Stack Trace를 출력할 때의 동작을 정확히 모방
  • 인터프리터를 둘러싼 "wrapper"와 같은 프로그램 제어 하에 Stack Trace를 출력하고자 할 때 유용
  • 즉, traceback 모듈은
    • Python에서 예외(Exception)가 발생했을 때 그 예외의 호출 stack을 추적하고 형식화된 출력을 제공하여 디버깅을 쉽게 해주는 강력한 도구
    • 예외 정보를 추적하고 기록하여 프로그램의 버그를 찾아내고 수정하는 데 매우 유용

1) Stack Trace란

  • aka stack backtrace or stack traceback
  • : a report of the active stack frames at a certain point in time during the execution of a program.
  • : a report of the computer's internal processing operations(컴퓨터의 내부 처리 작업에 대한 보고). It generally identifies the last routine called in the program before it crashed (일반적으로 프로그램이 충돌하기 전에 호출된 마지막 루틴을 식별함).
  • 배경:
    • When a program is run, memory is often dynamically allocated in two places: the stack and the heap. Memory is continuously allocated on a stack but not on a heap, thus reflective of their names.
    • Stack also refers to a programming construct, thus to differentiate it, this stack is referred to as the program's function call stack.
    • Technically, once a block of memory has been allocated on the stack, it cannot be easily removed as there can be other blocks of memory that were allocated before it.
    • Each time a function is called in a program, a block of memory called an activation record is allocated on top of the call stack.
    • Generally, the activation record stores the function's arguments and local variables.
    • What exactly it contains and how it's laid out is determined by the calling convention.

2. 주요 함수 및 메소드

1) traceback.print_exc()

  • 현재 예외에 대한 stack trace 출력
  • 예외가 발생한 위치stack의 호출 경로를 콘솔에 출력함
try:
    1 / 0
except ZeroDivisionError:
    traceback.print_exc()

2) traceback.format_exc()

  • 현재 예외에 대한 stack trace를 문자열로 반환
  • 보통 로깅에 유용하게 사용
try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    print(error_message)
# 사용 예
import logging
import traceback

logging.basicConfig(filename='app.log', level=logging.ERROR)

try:
    1 / 0
except ZeroDivisionError:
    error_message = traceback.format_exc()
    logging.error(error_message)
  • 설명: 'ZeroDivisionError' 예외가 발생했을 때, 그 stack trace를 'app.log' 파일에 기록함

 

참조

  1. (소스 코드) https://github.com/python/cpython/blob/3.12/Lib/traceback.py  
  2. (stack trace란) https://en.wikipedia.org/wiki/Stack_trace 
  3. (stack trace란) https://www.pcmag.com/encyclopedia/term/stack-trace 
  4.