Автозапуск отладчика Python при ошибке: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для автоматической активации отладчика Python pdb
при появлении ошибки следует использовать функцию sys.excepthook
. Эта функция вызывается Python при генерации неперехваченного исключения. Задача sys.excepthook
– инициировать pdb.post_mortem()
с трассировкой исключений, что позволяет начать постмортем-отладку прямо на месте, где произошла ошибка:
import sys
import pdb
def handle_exception(exc_type, exc_value, exc_traceback):
if sys.stdin.isatty() and sys.stdout.isatty() and sys.stderr.isatty():
pdb.post_mortem(exc_traceback)
sys.excepthook = handle_exception
Рекомендуется использовать IPython для более удобной отладки, так как он предлагает расширенные возможности по сравнению с pdb, включая подсветку синтаксиса и более интерактивный интерфейс через команду %pdb
.
С помощью запуска скрипта в интерактивном режиме командой python -i your_script.py
вы сможете оставить сессию открытой после ошибки и изучить переменные.
Использование pdb -c continue
автоматизирует процесс установки точек останова:
python -m pdb -c continue your_script.py
Создание специализированного модуля для отладки с вашим sys.excepthook
значительно упростит интеграцию pdb в различные сценарии.
Обработка исключений при помощи постмортем отладки pdb
Запускаем постмортем отладку
Изучите технику постмортем отладки с использованием pdb.post_mortem()
, применяя объект трассировки в качестве вашего указателя к ошибке:
import traceback
import pdb
try:
result = some_calculations()
except Exception:
exc_info = sys.exc_info()
traceback.print_exc() # Выводим трассировку на экран
pdb.post_mortem(exc_info[2]) # Начинаем отладку
Переходим к интерактиву
Используйте code.interact
, который дает возможность взаимодействия с локальным контекстом:
import code
try:
problematic_function()
except Exception:
# Запускаем интерактивную оболочку
code.interact(local=dict(globals(), **locals()))
Лямбда в помощь
Примените лямбда-функцию для упрощенного доступа к последнему фрейму в трассировке:
import pdb
import sys
sys.excepthook = lambda *exc_info: (lambda: pdb.post_mortem(sys.exc_info()[2]))()
Интегрируем пользовательские модули
Разработайте собственный модуль для отладки, который задаст атрибуты sys.excepthook
, и будет предоставлять необходимые инструменты, повторно используемые в разных скриптах.
Готовимся к отладке
Входим в ритм интерактива
Прежде чем активировать отладку, убедитесь, что ваша среда поддерживает интерактивный режим:
if sys.stdin.isatty() and sys.stdout.isatty() and sys.stderr.isatty():
sys.excepthook = handle_exception
Подготавливаемся к отправлению (выводим трассировку)
Прежде всего, выведите трассировку исключения, чтобы оценить ситуацию перед началом отладки:
import traceback
import pdb
import sys
def handle_exception(exc_type, exc_value, exc_traceback):
traceback.print_exception(exc_type, exc_value, exc_traceback)
pdb.post_mortem(exc_traceback)
sys.excepthook = handle_exception
Визуализация
Рассмотрите концепцию автоматического запуска отладчика Python, как подушки безопасности в автомобиле:
Пока всё в порядке: 🚗💨 -> Код исполняется Произошла ошибка: 🚗💥🔧 -> Ошибка!
try:
run_your_code()
except Exception:
trigger_debugger()
Также, как подушки безопасности срабатывают при аварии, отладчик помогает расследовать произошедшее и устранить проблему.
Подушка безопасности отладчика: 🛑🔧
- Активируется при ошибке в коде
- Облегчает процесс отладки
- Позволяет быстро обнаружить проблему
Совершенствуем навыки в отладке
Выбираем подходящий инструмент: IPython
Используйте IPython для более продуктивной отладки с функциями подсветки синтаксиса и автодополнения.
Специализированная отладка по типам ошибок
Настройте обработку исключений для конкретных типов ошибок:
def handle_value_error(exc_type, exc_value, exc_traceback):
if isinstance(exc_value, ValueError):
pdb.post_mortem(exc_traceback)
sys.excepthook = handle_value_error
Условный запуск отладки
Активируйте отладку исходя из наличия переменной окружения DEBUG
.
if os.getenv('DEBUG'):
sys.excepthook = handle_exception
Продвинутые приемы отладки
Используйте продвинутые функциональные возможности отладчика, включая условные точки останова и удаленную отладку.
Полезные материалы
- pdb — The Python Debugger — Python 3.12.1 documentation – официальная документация Python по pdb
- Starting python debugger automatically on error – Stack Overflow – обсуждение автоматического запуска отладчика на Stack Overflow
- sys — System-specific parameters and functions — Python 3.12.1 documentation – информация о
sys.excepthook
в документации Python - Python Exception Handling Techniques · Doug Hellmann – обзор практик обработки исключений в Python
- Jupyter and the future of IPython — IPython – ресурс для знакомства с IPython