traceback — 스택 트레이스 출력과 검색
traceback — 스택 트레이스 출력과 검색
traceback 모듈은 파이썬 프로그램의 스택 트레이스를 출력하거나 검색하는 표준 인터페이스를 제공해요. 예외 발생 시 파이썬 인터프리터가 sys.last_traceback 및 표준 오류에 표시하는 스택 트레이스 목록을 인쇄할 때 정확히 이 모듈을 사용해요. sys.exc_info()로 예외 정보를 얻고 tb를 받아서 다루는 방법, 트레이스백 객체를 다루는 방법이 설명돼 있어요.
본문
스택 트레이스 출력 (Print Exception)
traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True) — exc, 그리고 선택적으로 value와 tb(각각 예외 객체의 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_frame과 tb_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)