CodeGym /자바 코스 /Python SELF KO /스택 트레이스

스택 트레이스

Python SELF KO
레벨 17 , 레슨 4
사용 가능

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()

로깅은 나중에 더 자세히 다룰 거야. 근데, 이 정보가 도움이 되었길 바라.

1
Опрос
오류와 예외,  17 уровень,  4 лекция
недоступен
오류와 예외
오류와 예외
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION