traceback — 스택 트레이스 출력과 검색

traceback — 스택 트레이스 출력과 검색

traceback 모듈은 파이썬 프로그램의 스택 트레이스를 출력하거나 검색하는 표준 인터페이스를 제공해요. 예외 발생 시 파이썬 인터프리터가 sys.last_traceback 및 표준 오류에 표시하는 스택 트레이스 목록을 인쇄할 때 정확히 이 모듈을 사용해요. sys.exc_info()로 예외 정보를 얻고 tb를 받아서 다루는 방법, 트레이스백 객체를 다루는 방법이 설명돼 있어요.

출처: Python 표준 라이브러리 — traceback

본문

스택 트레이스 출력 (Print Exception)

traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)exc, 그리고 선택적으로 valuetb(각각 예외 객체의 args[0]__traceback__)로부터 예외 정보와 스택 트레이스를 구성해서 파일에 출력해요. limit이 양수면 limit 개의 스택 프레임만 출력하고, 음수면 대신 최대 abs(limit) 개의 프레임을 출력하며, None이면 모든 프레임을 출력해요.

traceback.print_exc(limit=None, file=None, chain=True)sys.exc_info()가 반환한 현재 예외의 트레이스백을 출력해요. print_exception(sys.exception(), limit, file, chain)과 동등합니다.

traceback.print_last(limit=None, file=None, chain=True)sys.last_exc에 저장된 마지막 예외를 출력해요.

traceback.print_stack(f=None, limit=None, file=None) — 각 스택 프레임마다 한 줄씩 표준 오류(또는 file)에 무한 스택 프레임 목록을 인쇄해요.

traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)print_exception()과 동일하지만 문자열을 출력하는 대신 문자열 리스트를 반환해요.

traceback.format_exc(limit=None, chain=True)print_exc()와 같지만 문자열을 반환해요.

traceback.format_tb(tb, limit=None)tb가 가리키는 스택 트레이스 프레임들의 형식화된 목록을 문자열 리스트로 반환해요.

traceback.format_stack(f=None, limit=None)print_stack()과 동일하지만 문자열 리스트를 반환해요.

traceback.clear_frames(tb) — 트레이스백 스택 프레임의 tb_frametb_next 속성에서 지역 변수를 지워주는 함수예요.

요약 (Summaries)

class traceback.TracebackException(exc, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10) — 나중에 띄어쓰기로 렌더링될 스택 트레이스의 실제 객체. 다룰 수 있는 속성: __cause__, __context__, __suppress_context__, __notes__, exc_type, exc_value, stack, _str, __traceback__, __notes__ 등이 있어요.

class traceback.StackSummary — 트레이스백 스택 프레임 목록을 형식화해 요약하는 클래스.

class traceback.FrameSummary(filename, lineno, name, lookup_line=True, locals=None, line=None)StackSummary의 단일 프레임을 나타내는 클래스. 속성: filename, lineno, name, line, locals.

프레임 다루기 (Frame Access)

  • traceback.extract_tb(tb, limit=None) — 트레이스백 객체 tb로부터 FrameSummary 객체들의 StackSummary를 반환해요.
  • traceback.extract_stack(f=None, limit=None) — 현재 스택 트레이스에서 extract_tb()과 같은 요약 목록을 추출해요.
  • traceback.walk_tb(tb)tb에서 시작해 tb_next를 따라가며 (프레임, 라인) 튜플을 생성하는 제너레이터.
  • traceback.walk_stack(f)f에서 시작해 스택을 따라가며 (프레임, 라인) 튜플을 생성하는 제너레이터.

예외 처리 예시 (Examples)

print_exception()을 명시적으로 호출하는 예:

import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except IndexError:
    exc = sys.exception()
    print("*** print_tb:")
    traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
    print("*** print_exception:")
    # exc.__traceback__ limits the print to that traceback only
    traceback.print_exception(exc, limit=1, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc(limit=1, file=sys.stdout)
    print("*** format_exc, first line:")
    formatted_lines = traceback.format_exc(limit=1).splitlines()
    print(formatted_lines[0])
    print("*** format_exception:")
    print(repr(traceback.format_exception(exc)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exc.__traceback__)))

사용자 지정 로그 포매터를 만들 때 유용한 StackSummary 사용 예시:

from traceback import StackSummary
from io import StringIO

def get_formatted_lines(exc):
    tb = exc.__traceback__
    # returns a StackSummary object
    summary = StackSummary.extract(walk_tb(tb))
    return format_list(summary)

FrameSummary와 함께 파일·줄 번호·함수 이름을 검색하는 예:

from traceback import walk_tb, StackSummary

def get_stack_info(exc):
    tb = exc.__traceback__
    summary = StackSummary.extract(walk_tb(tb))
    for frame in summary:
        print(frame.filename, frame.lineno, frame.name, frame.line)

더 알아보기