traceback — 스택 트레이스백 인쇄와 조회¶
소스 코드: Lib/traceback.py
이 모듈은 파이썬 프로그램을 위한 스택 트레이스를 추출, 포맷 및 인쇄하는 표준 인터페이스를 제공합니다. 이는 인터프리터의 기본 트레이스백 표시 방식보다 더 유연하여 출력의 특정 측면을 구성할 수 있게 합니다. 마지막으로, 실제 예외에 대한 참조를 저장할 필요 없이 나중에 인쇄하기에 충분한 정보를 캡처하는 유틸리티를 포함합니다. 예외가 큰 객체 그래프의 근원이 될 수 있으므로, 이 유틸리티는 메모리 관리를 크게 개선할 수 있습니다.
모듈은 traceback 객체— 이들은 타입 types.TracebackType`의 객체이며, :class:`BaseException 인스턴스의 __traceback__ 필드에 할당됩니다.
더 보기
- 모듈
faulthandler 명시적으로 파이썬 트레이스백을 덤프하는 데 사용됩니다. 오류 발생 시, 시간 초과 후 또는 사용자 신호를 받았을 때 사용됩니다.
- 모듈
pdb 파이썬 프로그램을 위한 대화형 소스 코드 디버거입니다.
모듈의 API는 두 부분으로 나눌 수 있습니다:
예외 및 트레이스백의 대화형 검사에 유용한 기본 기능을 제공하는 모듈 수준 함수들입니다.
TracebackException클래스와 그 헬퍼 클래스인StackSummary및 :class:`FrameSummary`입니다. 이들은 출력 생성에 더 많은 유연성을 제공하며, 실제 예외 및 트레이스백 객체에 대한 참조를 유지하지 않고 나중에 포맷하는 데 필요한 정보를 저장하는 기능을 제공합니다.
Added in version 3.13: 기본적으로 출력은 색상화되며 사용하는 환경 변수를 를 사용하여 제어할 수 있습니다.`
모듈 수준 함수¶
- traceback.print_tb(tb, limit=None, file=None)¶
limit가 양수면 (호출자 프레임에서 시작하여) 트레이스백 객체 tb의 최대 limit 개의 스택 트레이스 항목을 인쇄합니다. 그렇지 않으면, 마지막
abs(limit)항목을 인쇄합니다. limit가 생략되거나None이면, 모든 항목이 인쇄됩니다. file이 생략되거나None이면, 출력은sys.stderr로 갑니다; 그렇지 않으면 출력을 받을 열린 파일이나 파일류 객체여야 합니다.참고
limit 매개변수의 의미는
sys.tracebacklimit`의 의미와 다릅니다. 음수 *limit* 값은 :const:!sys.tracebacklimit`의 양수 값에 해당하며, 양수 limit 값의 동작은 :const:`!sys.tracebacklimit`로는 달성할 수 없습니다.버전 3.5에서 변경: 음수 limit 지원을 추가했습니다.
- traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True)¶
예외 정보와 트레이스백 객체 tb의 스택 트레이스 항목을 file로 인쇄합니다. 이것은 다음과 같은 점에서
print_tb()와 다릅니다:tb가
None이 아니면, 헤더Traceback (most recent call last):를 인쇄합니다.스택 트레이스 다음에 예외 형과 value를 인쇄합니다
type(value)가
SyntaxError고 value가 적절한 형식을 가지면, 에러의 대략적인 위치를 나타내는 캐럿(caret)과 함께 문법 에러가 발생한 줄을 인쇄합니다.
파이썬 3.10부터는 value 와 tb 를 전달하는 대신, 예외 객체를 첫 번째 인수로 전달할 수 있습니다. 만약 value 와 tb 가 제공되는 경우, 하위 호환성을 위해 첫 번째 인수는 무시됩니다.
선택적 limit 인자는
print_tb()와 같은 의미입니다. chain이 참(기본값)이면, 처리되지 않은 예외를 인쇄할 때 인터프리터 자체가 하는 것과 마찬가지로, 연결된 예외(예외의__cause__나__context__어트리뷰트)도 인쇄됩니다.버전 3.5에서 변경: etype 인자는 무시되고 value 형에서 유추됩니다.
버전 3.10에서 변경: etype 매개변수는 exc 로 이름이 변경되었고, 이제 위치 기반 전용입니다.
- traceback.print_exc(limit=None, file=None, chain=True)¶
이것은
print_exception(sys.exception(), limit=limit, file=file, chain=chain)의 줄임 표현입니다.
- traceback.print_last(limit=None, file=None, chain=True)¶
이것은
print_exception(sys.last_exc, limit=limit, file=file, chain=chain)의 줄임 표현입니다. 일반적으로 예외가 대화식 프롬프트에 도달한 후에만 작동합니다 (sys.last_exc을 참조하십시오).
- traceback.print_stack(f=None, limit=None, file=None)¶
limit가 양수면 (호출 지점에서 시작하여) 최대 limit 개의 스택 트레이스 항목을 인쇄합니다. 그렇지 않으면, 마지막
abs(limit)항목을 인쇄합니다. limit가 생략되거나None이면, 모든 항목이 인쇄됩니다. 선택적 f 인자를 사용하여 시작할 대체 스택 프레임을 지정할 수 있습니다. 선택적 file 인자는print_tb()와 같은 의미입니다.버전 3.5에서 변경: 음수 limit 지원을 추가했습니다.
- traceback.extract_tb(tb, limit=None)¶
traceback 객체 tb\에서 추출된 “전 처리된” 스택 트레이스 항목 리스트를 나타내는
StackSummary객체를 반환합니다. 스택 트레이스의 대체 포매팅에 유용합니다. 선택적 limit 인자는print_tb`와 같은 의미입니다. "전 처리된" 스택 트레이스 항목은 일반적으로 스택 트레이스를 위해 인쇄되는 정보를 나타내는 속성이 포함된 :class:`FrameSummary()객체입니다.
- traceback.extract_stack(f=None, limit=None)¶
현재 스택 프레임에서 날 트레이스백을 추출합니다. 반환 값은
extract_tb()와 같은 형식입니다. 선택적 f와 limit 인자는print_stack()과 같은 의미입니다.
- traceback.print_list(extracted_list, file=None)¶
extract_tb()또는extract_stack()가 반환하는 튜플 리스트를 주어진 파일에 포맷된 스택 트레이스로 인쇄합니다. 만약 file 이None이면, 출력은sys.stderr에 작성됩니다.
- traceback.format_list(extracted_list)¶
extract_tb()나extract_stack()이 반환한 튜플이나FrameSummary객체의 리스트가 제공되면, 인쇄할 준비가 된 문자열의 리스트를 반환합니다. 결과 리스트의 각 문자열은 인자 리스트에서 같은 인덱스를 가진 항목에 해당합니다. 각 문자열은 줄 바꿈으로 끝납니다; 소스 텍스트 줄이None이 아닌 항목의 경우, 문자열에 내부 줄 바꿈도 포함될 수 있습니다.
- traceback.format_exception_only(exc, /, [value, ]*, show_group=False)¶
sys.last_exc`와 같은 예외 값을 사용하여 트레이스백의 예외 부분을 포맷합니다. 반환 값은 각각 줄 바꿈으로 끝나는 문자열의 리스트입니다. 리스트는 예외 메시지를 포함하는데, 이는 일반적으로 단일 문자열입니다. 그러나, :exc:`SyntaxError예외의 경우, 문법 에러가 발생한 위치에 대한 자세한 정보를 (인쇄될 때) 표시하는 여러 줄을 포함합니다. 메시지 다음으로, 리스트는 예외의 :attr:`notes <BaseException.__notes__>`를 포함합니다.파이썬 3.10부터는 value 를 전달하는 대신, 예외 객체를 첫 번째 인수로 전달할 수 있습니다. 만약 value 가 제공되는 경우, 하위 호환성을 위해 첫 번째 인수는 무시됩니다.
show_group 이
True이고 예외가BaseExceptionGroup의 인스턴스인 경우, 중첩된 예외도 중첩 깊이에 상대적인 들여쓰기와 함께 재귀적으로 포함됩니다.버전 3.10에서 변경: etype 매개변수는 exc 로 이름이 변경되었고, 이제 위치 기반 전용입니다.
버전 3.11에서 변경: 반환된 리스트에는 이제 예외에 첨부된 모든 :attr:`notes <BaseException.__notes__>`가 포함됩니다.
버전 3.13에서 변경: show_group 매개변수가 추가되었습니다.
- traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)¶
스택 트레이스와 예외 정보를 포맷합니다. 인자는
print_exception()의 해당하는 인자와 같은 의미입니다. 반환 값은 각각 줄 바꿈으로 끝나고 일부는 내부 줄 바꿈을 포함하는 문자열의 리스트입니다. 이 줄들을 이어붙여서 인쇄하면,print_exception()과 정확히 같은 텍스트가 인쇄됩니다.버전 3.5에서 변경: etype 인자는 무시되고 value 형에서 유추됩니다.
버전 3.10에서 변경: 이 함수의 동작 및 시그니처는 :func:`print_exception`와 일치하도록 수정되었습니다.
- traceback.format_exc(limit=None, chain=True)¶
이것은
print_exc(limit)와 비슷하지만, 파일로 인쇄하는 대신 문자열을 반환합니다.
- traceback.format_tb(tb, limit=None)¶
format_list(extract_tb(tb, limit))의 줄임 표현입니다.
- traceback.format_stack(f=None, limit=None)¶
format_list(extract_stack(f, limit))의 줄임 표현입니다.
- traceback.clear_frames(tb)¶
각 프레임 객체의
clear()메서드를 호출하여 트레이스백 tb에 있는 모든 스택 프레임의 지역 변수를 지웁니다.Added in version 3.4.
- traceback.walk_stack(f)¶
주어진 프레임에서
f.f_back을 따라 스택을 걸어가며 각 프레임의 프레임과 줄 번호를 산출(yield)합니다. f가None이면, 현재 스택이 사용됩니다. 이 도우미는StackSummary.extract()와 함께 사용됩니다.Added in version 3.5.
버전 3.14에서 변경: 이 함수는 이터레이션 시 스택을 순회하는 제너레이터를 반환하던 것이었습니다. 이제 반환되는 제너레이터는
walk_stack이 호출될 때의 스택 상태입니다.
- traceback.walk_tb(tb)¶
tb_next를 따라 트레이스백을 걸으면서 각 프레임의 프레임과 줄 번호를 산출(yield)합니다. 이 도우미는StackSummary.extract()와 함께 사용됩니다.Added in version 3.5.
TracebackException 객체¶
Added in version 3.5.
TracebackException 객체는 실제 예외로부터 생성되어 나중에 인쇄할 데이터를 포착합니다. 이 클래스는 traceback<traceback-objects>` 및 frame 객체에 대한 참조를 유지하지 않음으로써, 보다 가벼운 방식으로 이 정보를 저장할 수 있는 옵션을 제공합니다. 또한, 위에서 설명된 모듈 수준 함수에 비해 출력을 구성하는 더 많은 옵션을 노출합니다.
- class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
나중에 렌더링하기 위해 예외를 포착합니다. limit, lookup_lines 및 capture_locals의 의미는
StackSummary클래스와 같습니다.compact 가 true이면,
TracebackException의format()메서드에 필요한 데이터만 클래스 속성에 저장됩니다. 특히,__context__필드는__cause__가None이고__suppress_context__가 false일 때만 계산됩니다.locals가 포착되면, 트레이스백에도 표시됨에 유의하십시오.
max_group_width 와 max_group_depth 는 예외 그룹(
BaseExceptionGroup)의 형식을 제어합니다. 깊이(depth)는 그룹의 중첩 수준을, 너비(width)는 단일 예외 그룹의 예외 배열 크기를 나타냅니다. 어느 한 쪽의 제한을 초과하면 형식화된 출력은 잘립니다.버전 3.10에서 변경: compact 매개 변수를 추가했습니다.
버전 3.11에서 변경: max_group_width*와 *max_group_depth 매개 변수를 추가했습니다.
- __context__¶
원래
__context__의TracebackException.
- exceptions¶
만약
self가ExceptionGroup을 나타내면, 이 필드는 중첩된 예외를 나타내는TracebackException인스턴스 목록을 가집니다. 그렇지 않으면None입니다.Added in version 3.11.
- __suppress_context__¶
원래 예외의
__suppress_context__값.
- __notes__¶
원본 예외로부터의
__notes__값 또는 예외에 노트가 없는 경우None입니다. 만약None이 아닌 경우, 예외 문자열 다음에 트레이스백에 형식화됩니다.Added in version 3.11.
- stack¶
트레이스백을 나타내는
StackSummary.
- exc_type¶
원본 예외의 클래스입니다.
버전 3.13부터 폐지됨.
- exc_type_str¶
원래 예외 클래스의 문자열 표시.
Added in version 3.13.
- filename¶
문법 에러일 때 - 에러가 발생한 파일 이름.
- lineno¶
문법 에러일 때 - 에러가 발생한 줄 번호.
- end_lineno¶
문법 에러일 때 - 에러가 발생한 끝 줄 번호. 존재하지 않으면
None일 수 있습니다.Added in version 3.10.
- text¶
문법 에러일 때 - 에러가 발생한 텍스트.
- offset¶
문법 에러일 때 - 에러가 발생한 텍스트에서의 오프셋.
- end_offset¶
문법 에러일 때 - 에러가 발생한 텍스트에서의 끝 오프셋. 존재하지 않으면
None일 수 있습니다.Added in version 3.10.
- msg¶
문법 에러일 때 - 컴파일러 에러 메시지.
- classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False, compact=False, max_group_width=15, max_group_depth=10)¶
나중에 렌더링하기 위해 예외를 포착합니다. limit, lookup_lines 및 capture_locals는
StackSummary클래스와 같습니다.locals가 포착되면, 트레이스백에도 표시됨에 유의하십시오.
- print(*, file=None, chain=True)¶
format`이 반환하는 예외 정보를 *파일* (기본값 ``sys.stderr`()) 에 출력합니다.Added in version 3.11.
- format(*, chain=True)¶
예외를 포맷합니다.
chain이
True가 아니면,__cause__와__context__는 포맷되지 않습니다.반환 값은 각각 줄 바꿈으로 끝나고 일부는 내부 줄 바꿈을 포함하는 문자열의 제너레이터입니다.
print_exception()은 단지 파일에 줄을 인쇄하는 이 메서드를 둘러싸는 래퍼입니다.
- format_exception_only(*, show_group=False)¶
트레이스백의 예외 부분을 포맷합니다.
반환 값은 각각 줄 바꿈으로 끝나는 문자열의 제너레이터입니다.
show_group이
False일 때, 제너레이터는 예외 메시지와 (노트가 있다면) 그 뒤를 따르는 노트를 방출합니다. 예외 메시지는 일반적으로 단일 문자열입니다; 그러나SyntaxError예외의 경우, 문법 에러가 발생한 위치에 대한 자세한 정보를 (인쇄할 때) 표시하는 여러 줄로 구성됩니다.show_group 이
True이고 예외가BaseExceptionGroup의 인스턴스인 경우, 중첩된 예외도 중첩 깊이에 상대적인 들여쓰기와 함께 재귀적으로 포함됩니다.버전 3.11에서 변경: 예외의 :attr:`notes <BaseException.__notes__>`가 이제 출력에 포함됩니다.
버전 3.13에서 변경: show_group 매개 변수를 추가했습니다.
StackSummary 객체¶
Added in version 3.5.
StackSummary 객체는 포맷 준비가 된 호출 스택을 나타냅니다.
- class traceback.StackSummary¶
- classmethod extract(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False)¶
(
walk_stack()이나walk_tb()에서 반환된 것과 같은) 프레임 제너레이터로StackSummary객체를 생성합니다.limit가 제공되면, frame_gen에서 이 수 만큼의 프레임만 취합니다. lookup_lines가
False이면, 반환된FrameSummary객체는 아직 해당 줄을 읽지 않아서StackSummary를 만드는 비용을 줄입니다 (실제로 포맷되지 않을 수 있다면 유용 할 수 있습니다). capture_locals가True이면, 각FrameSummary의 지역 변수는 객체 표현(representation)으로 포착됩니다.버전 3.12에서 변경: 로컬 변수에 대해
repr()에서 발생한 예외는 (capture_locals 가True일 때) 더 이상 호출자에게 전파되지 않습니다.
- classmethod from_list(a_list)¶
제공된
FrameSummary객체의 리스트나 이전 스타일의 튜플 리스트로StackSummary객체를 생성합니다. 각 튜플은 filename, lineno, name, line을 요소로 하는 4-튜플이어야 합니다.
- format()¶
인쇄 준비가 된 문자열의 리스트를 반환합니다. 결과 리스트의 각 문자열은 스택의 단일 프레임에 해당합니다. 각 문자열은 줄 바꿈으로 끝납니다; 소스 텍스트 줄이 있는 항목의 경우, 문자열에 내부 줄 바꿈도 포함될 수 있습니다.
같은 프레임과 줄의 긴 시퀀스의 경우, 처음 몇 번의 반복이 표시된 다음, 정확한 추가의 반복 횟수를 나타내는 요약 줄이 표시됩니다.
버전 3.6에서 변경: 반복되는 프레임의 긴 시퀀스가 이제 축약됩니다.
- format_frame_summary(frame_summary)¶
스택에 관련된 frames 중 하나에 대한 문자열을 반환합니다. 이 메서드는
StackSummary.format()에 의해 인쇄될FrameSummary객체 각각에 대해 호출됩니다.None을 반환하면 해당 프레임은 출력에서 누락됩니다.Added in version 3.11.
FrameSummary 객체¶
Added in version 3.5.
FrameSummary 객체는 트레이스백에서 단일 프레임을 나타냅니다.
- class traceback.FrameSummary(filename, lineno, name, *, lookup_line=True, locals=None, line=None, end_lineno=None, colno=None, end_colno=None)¶
포맷되거나 인쇄 중인 트레이스백이나 스택의 단일 프레임을 나타냅니다. 선택적으로 문자열로 변환된 버전의 프레임 지역 변수를 포함할 수 있습니다. lookup_line이
False이면,FrameSummary의line어트리뷰트에 액세스할 때까지 (tuple로 캐스트 할 때도 발생합니다) 소스 코드를 찾지 않습니다.line은 직접 제공될 수 있으며, 줄 조회가 전혀 발생하지 않도록 합니다. locals는 선택적 지역 변수 매핑이며, 제공되면 변수 표현(representation)은 나중에 표시할 수 있도록 요약에 저장됩니다.FrameSummary인스턴스는 다음 속성을 가집니다:- filename¶
이 프레임의 소스 코드 파일명입니다. 이는 frame object f_ 의
f_.f_code.co_filename에 접근하는 것과 같습니다.
- lineno¶
이 프레임의 소스 코드 줄 번호입니다.
- name¶
frame object f_ 의
f_.f_code.co_name에 접근하는 것과 같습니다.
- line¶
이 프레임의 소스 코드를 나타내는 문자열이며, 선행 및 후행 공백이 제거되었습니다. 소스를 사용할 수 없는 경우
None입니다.
- end_lineno¶
이 프레임의 소스 코드의 마지막 줄 번호입니다. 기본적으로
lineno로 설정되며 인덱싱은 1부터 시작합니다.버전 3.13에서 변경: 기본값이
None에서lineno로 변경되었습니다.
- colno¶
이 프레임의 소스 코드 열 번호입니다. 기본적으로
None이며 인덱싱은 0부터 시작합니다.
- end_colno¶
이 프레임의 소스 코드 마지막 열 번호입니다. 기본적으로
None이며 인덱싱은 0부터 시작합니다.
모듈 수준 함수 사용 예제¶
이 간단한 예제는 표준 파이썬 대화식 인터프리터 루프와 비슷하지만 (하지만 덜 유용한) 기본적인 읽기-평가-인쇄 루프를 구현합니다. 인터프리터 루프의 더욱 완전한 구현은 code 모듈을 참조하십시오.
import sys, traceback
def run_user_code(envdir):
source = input(">>> ")
try:
exec(source, envdir)
except Exception:
print("Exception in user code:")
print("-"*60)
traceback.print_exc(file=sys.stdout)
print("-"*60)
envdir = {}
while True:
run_user_code(envdir)
다음 예제는 예외와 추적을 인쇄하고 포맷하는 다양한 방법을 보여줍니다:
import sys, traceback
def lumberjack():
bright_side_of_life()
def bright_side_of_life():
return tuple()[0]
try:
lumberjack()
except IndexError as exc:
print("*** print_tb:")
traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)
print("*** print_exception:")
traceback.print_exception(exc, limit=2, file=sys.stdout)
print("*** print_exc:")
traceback.print_exc(limit=2, file=sys.stdout)
print("*** format_exc, first and last line:")
formatted_lines = traceback.format_exc().splitlines()
print(formatted_lines[0])
print(formatted_lines[-1])
print("*** format_exception:")
print(repr(traceback.format_exception(exc)))
print("*** extract_tb:")
print(repr(traceback.extract_tb(exc.__traceback__)))
print("*** format_tb:")
print(repr(traceback.format_tb(exc.__traceback__)))
print("*** tb_lineno:", exc.__traceback__.tb_lineno)
예제의 출력은 다음과 유사합니다:
*** print_tb:
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
*** print_exception:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
File "<doctest...>", line 10, in <module>
lumberjack()
~~~~~~~~~~^^
File "<doctest...>", line 4, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n',
'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
<FrameSummary file <doctest...>, line 4 in lumberjack>,
<FrameSummary file <doctest...>, line 7 in bright_side_of_life>]
*** format_tb:
[' File "<doctest default[0]>", line 10, in <module>\n lumberjack()\n ~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 4, in lumberjack\n bright_side_of_life()\n ~~~~~~~~~~~~~~~~~~~^^\n',
' File "<doctest default[0]>", line 7, in bright_side_of_life\n return tuple()[0]\n ~~~~~~~^^^\n']
*** tb_lineno: 10
다음 예제는 스택을 인쇄하고 포맷하는 다양한 방법을 보여줍니다:
>>> import traceback
>>> def another_function():
... lumberstack()
...
>>> def lumberstack():
... traceback.print_stack()
... print(repr(traceback.extract_stack()))
... print(repr(traceback.format_stack()))
...
>>> another_function()
File "<doctest>", line 10, in <module>
another_function()
File "<doctest>", line 3, in another_function
lumberstack()
File "<doctest>", line 6, in lumberstack
traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
('<doctest>', 3, 'another_function', 'lumberstack()'),
('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
[' File "<doctest>", line 10, in <module>\n another_function()\n',
' File "<doctest>", line 3, in another_function\n lumberstack()\n',
' File "<doctest>", line 8, in lumberstack\n print(repr(traceback.format_stack()))\n']
이 마지막 예제는 마지막 몇 가지 포매팅 함수를 예시합니다:
>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
... ('eggs.py', 42, 'eggs', 'return "bacon"')])
[' File "spam.py", line 3, in <module>\n spam.eggs()\n',
' File "eggs.py", line 42, in eggs\n return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(an_error)
['IndexError: tuple index out of range\n']
TracebackException을 사용하는 예제¶
헬퍼 클래스와 함께, 더 많은 옵션을 가집니다:
>>> import sys
>>> from traceback import TracebackException
>>>
>>> def lumberjack():
... bright_side_of_life()
...
>>> def bright_side_of_life():
... t = "bright", "side", "of", "life"
... return t[5]
...
>>> try:
... lumberjack()
... except IndexError as e:
... exc = e
...
>>> try:
... try:
... lumberjack()
... except:
... 1/0
... except Exception as e:
... chained_exc = e
...
>>> # limit 는 모듈 수준 함수처럼 작동합니다
>>> TracebackException.from_exception(exc, limit=-2).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
>>> # capture_locals 는 프레임에 지역 변수를 추가합니다
>>> TracebackException.from_exception(exc, limit=-2, capture_locals=True).print()
Traceback (most recent call last):
File "<python-input-1>", line 6, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-1>", line 10, in bright_side_of_life
return t[5]
~^^^
t = ("bright", "side", "of", "life")
IndexError: tuple index out of range
>>> # print() 의 *chain* 키워드 인자는 연결된 예외를
>>> # 표시할지를 제어합니다
>>> TracebackException.from_exception(chained_exc).print()
Traceback (most recent call last):
File "<python-input-19>", line 4, in <module>
lumberjack()
~~~~~~~~~~^^
File "<python-input-8>", line 7, in lumberjack
bright_side_of_life()
~~~~~~~~~~~~~~~~~~~^^
File "<python-input-8>", line 11, in bright_side_of_life
return t[5]
~^^^
IndexError: tuple index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero
>>> TracebackException.from_exception(chained_exc).print(chain=False)
Traceback (most recent call last):
File "<python-input-19>", line 6, in <module>
1/0
~^~
ZeroDivisionError: division by zero