Стек-трейс

Модуль 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()

Логирование мы рассмотрим немного позже, но, думаю, эта информация была вам полезной.

2
Задача
Модуль 1: Python Core, 10 уровень, 4 лекция
Недоступна
Использование traceback
Использование traceback
2
Задача
Модуль 1: Python Core, 10 уровень, 4 лекция
Недоступна
Анализ стек-трейс
Анализ стек-трейс
1
Опрос
Ошибки и исключения, 10 уровень, 4 лекция
Недоступен
Ошибки и исключения
Ошибки и исключения
Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
AlterAyrol Уровень 25
22 октября 2025
несколько сложно и абстрактно изложен блок, а вот итоговый тест по нему на редкость простой получился:
Vasyl Tverdokhlib Уровень 22
19 августа 2025
ошибка компиляции, этот вариант наверное из пайтона 5.0 ошибка неправильной операционной системы это для кого вопрос, ответ: Логическая ошибка в программировании — это ошибка в логике работы программы у меня со зрением плохо, где этот пункт?
6 августа 2025
Зато ответ "всплытие исключений" верен, хотя Процесс "всплытия исключений" (или распространение исключений) — это механизм, при котором исключение, возникшее в одном методе, автоматически передаётся вверх по цепочке вызовов (стеку), пока не будет перехвачено или не завершит программу. По сути оба ответа верны.
6 августа 2025
Как называется процесс, когда исключение передается от метода к методу вверх по стеку вызовов? Ответ: распространение исключения - неверен. Хотя: Процесс, при котором исключение передаётся от метода к методу вверх по стеку вызовов, пока не будет перехвачено или не завершит программу, называется "распространение исключения" (англ. exception propagation).
Slevin Уровень 64
3 июля 2025
Господа, вставляйте код в редактор и запускайте - увидите результат. Неудобно, но что делать...
6 августа 2025
я так и делаю :)
Anonymous #2662922 Уровень 30
9 марта 2025
Странный подход у авторов курса, после некоторых примеров показано что выводит написанный код, а в данной лекции почему-то результатов работы кода нет, хотя для полного понимания результатов работы кода очень не хватает.
Олексій Єрмак Уровень 25
16 февраля 2025
хорошо было бы, если бы немного расписывали, что происходит после команды except
SWK Уровень 26
8 апреля 2025
Вероятно, то, что после неё написано.
13 февраля 2025
Вангую, из всего арсенала этой статьи будет использоваться только это

except ZeroDivisionError as e:
        logging.error("Произошло исключение: ...)
Dmitry Ryabov Уровень 23
6 февраля 2025
Такие классные примеры, что собственно ничего не показывают