Стек-трейс

Відкрита

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

Логування ми розглянемо трохи пізніше, але, думаю, ця інформація була вам корисною.

2
Задача
Модуль 1: Python Core,  10 рівень,  4 лекція
Недоступна
Використання traceback
Використання traceback
2
Задача
Модуль 1: Python Core,  10 рівень,  4 лекція
Недоступна
Аналіз стек-трейс
Аналіз стек-трейс
Коментарі (1)
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Deits
Рівень 64
17 червня, 09:33
"З якого кінця слід починати читання трасування стеку під час налагодження?" питання некорректне, і містить саму відповідь я пропоную виправити на: "З якого місця слід починати читання трасування стеку під час налагодження?"