Стек-трейс

Модуль 1: Python Core
Рівень 10 , Лекція 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)

Ця функція витягує "сирі" відомості про трасування стека з об'єкта трасування (traceback object), який можна отримати через sys.exc_info(). Повертає список фреймів стека.

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
Опитування
Помилки та винятки, рівень 10, лекція 4
Недоступний
Помилки та винятки
Помилки та винятки
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ