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()
Логування ми розглянемо трохи пізніше, але, думаю, ця інформація була вам корисною.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ