5.1 모듈 traceback
스택 트레이스 (traceback)
— 함수 호출이 예외를 발생시키게 된
순서를 보여주는 정보야. 이건 디버깅에 중요한 도구로, 어디서 왜
에러가 발생했는지 이해하는 데 도움을 줘.
스택 트레이스 (traceback)
분석은 프로그램 디버깅의 중요한 부분이고,
개발자가 어디서 왜 에러가 발생했는지 이해할 수 있게 해줘. Python은
모듈 traceback
을 제공하는데, 이 모듈은 스택 트레이스를 다루기 위한 함수들을 포함하고 있어. 이 모듈은
스택 트레이스 정보를 추출하고, 포맷하고, 출력할 수 있게 해줘.
스택 트레이스를 얻고 다루기
스택 트레이스를 다루려면 모듈
traceback
을 임포트 해야 해. 이 모듈은 스택 트레이스 정보를 포맷하고
출력하기 위한 함수들을 제공해.
스택 트레이스를 얻고 출력하는 예시:
import traceback
def function_c():
return 1 / 0 # 이건 ZeroDivisionError를 발생시킬 거야
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
print("예외가 발생했어:")
traceback.print_exc() # 스택 트레이스를 출력해
function_a()
출력:
예외가 발생했어:
Traceback (most recent call last):
File "example.py", line 12, in function_a
function_b()
File "example.py", line 8, in function_b
function_c()
File "example.py", line 4, in function_c
return 1 / 0
ZeroDivisionError: division by zero
함수 traceback.print_exc()
이 함수는 현재 예외의 스택 트레이스를 표준 오류 스트림에 출력해.
예시:
try:
1 / 0
except ZeroDivisionError:
traceback.print_exc()
함수 traceback.format_exc()
이 함수는 현재 예외의 포맷된 스택 트레이스를 문자열로 반환해.
try:
1 / 0
except ZeroDivisionError:
error_message = traceback.format_exc()
print("문자열로 얻은 스택 트레이스:")
print(error_message)
함수 traceback.extract_tb(tb)
이 함수는 sys.exc_info()
를 통해 얻을 수 있는
(traceback object)
에서 "원시" 스택 트레이스 정보를 추출해.
스택 프레임의 리스트를 반환해.
5.2 스택 트레이스 처리 및 분석
함수 traceback.format_tb(tb)
이 함수는 스택 트레이스를 나타내는 포맷된 문자열 리스트를 반환해.
import sys
import traceback
def function_c():
return 1 / 0 # 이건 ZeroDivisionError를 발생시킬 거야
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
formatted_tb = traceback.format_tb(tb)
print("포맷된 스택 트레이스:")
for line in formatted_tb:
print(line, end="")
function_a()
함수 traceback.format_exception(exc_type, exc_value, exc_tb)
이 함수는 예외와 스택 트레이스를 나타내는 포맷된 문자열의 전체 리스트를 반환해.
import sys
import traceback
def function_c():
return 1 / 0 # 이건 ZeroDivisionError를 발생시킬 거야
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
print("전체 포맷된 스택 트레이스:")
for line in full_tb:
print(line, end="")
function_a()
때때로 예외가 발생한 위치와 해당 위치의 컨텍스트에 대한 구체적인 정보를 얻기 위해 각 스택 프레임을 더 자세히 분석하는 것이 유용해.
import traceback
import sys
def function_c():
return 1 / 0 # 이건 ZeroDivisionError를 발생시킬 거야
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError:
tb = sys.exc_info()[2]
for frame in traceback.extract_tb(tb):
print(f"파일: {frame.filename}")
print(f"라인: {frame.lineno}")
print(f"함수 이름: {frame.name}")
print(f"텍스트: {frame.line}")
print("-" * 40)
function_a()
5.3 로그를 위한 traceback
사용
때때로 스택 트레이스 정보를 로그 파일에 기록해 두는 게 중요할 때가 있어, 이후 분석을 위해서 말이야. 이건
모듈 traceback
과 표준
모듈 logging
을 이용해서 할 수 있어.
예시:
import logging
import traceback
import sys
logging.basicConfig(filename='error.log', level=logging.ERROR)
def function_c():
return 1 / 0 # 이건 ZeroDivisionError를 발생시킬 거야
def function_b():
function_c()
def function_a():
try:
function_b()
except ZeroDivisionError as e:
exc_type, exc_value, exc_tb = sys.exc_info()
full_tb = traceback.format_exception(exc_type, exc_value, exc_tb)
logging.error("예외가 발생했어:\n%s", ''.join(full_tb))
function_a()
로깅은 나중에 더 자세히 다룰 거야. 근데, 이 정보가 도움이 되었길 바라.
GO TO FULL VERSION