logo

Автозапуск отладчика Python при ошибке: решение

Быстрый ответ

Для автоматической активации отладчика Python pdb при появлении ошибки следует использовать функцию sys.excepthook. Эта функция вызывается Python при генерации неперехваченного исключения. Задача sys.excepthook – инициировать pdb.post_mortem() с трассировкой исключений, что позволяет начать постмортем-отладку прямо на месте, где произошла ошибка:

Python
Скопировать код
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 автоматизирует процесс установки точек останова:

Bash
Скопировать код
python -m pdb -c continue your_script.py

Создание специализированного модуля для отладки с вашим sys.excepthook значительно упростит интеграцию pdb в различные сценарии.

Обработка исключений при помощи постмортем отладки pdb

Запускаем постмортем отладку

Изучите технику постмортем отладки с использованием pdb.post_mortem(), применяя объект трассировки в качестве вашего указателя к ошибке:

Python
Скопировать код
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, который дает возможность взаимодействия с локальным контекстом:

Python
Скопировать код
import code

try:
    problematic_function()
except Exception:
    # Запускаем интерактивную оболочку
    code.interact(local=dict(globals(), **locals()))

Лямбда в помощь

Примените лямбда-функцию для упрощенного доступа к последнему фрейму в трассировке:

Python
Скопировать код
import pdb
import sys

sys.excepthook = lambda *exc_info: (lambda: pdb.post_mortem(sys.exc_info()[2]))()

Интегрируем пользовательские модули

Разработайте собственный модуль для отладки, который задаст атрибуты sys.excepthook, и будет предоставлять необходимые инструменты, повторно используемые в разных скриптах.

Готовимся к отладке

Входим в ритм интерактива

Прежде чем активировать отладку, убедитесь, что ваша среда поддерживает интерактивный режим:

Python
Скопировать код
if sys.stdin.isatty() and sys.stdout.isatty() and sys.stderr.isatty():
    sys.excepthook = handle_exception

Подготавливаемся к отправлению (выводим трассировку)

Прежде всего, выведите трассировку исключения, чтобы оценить ситуацию перед началом отладки:

Python
Скопировать код
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, как подушки безопасности в автомобиле:

Пока всё в порядке: 🚗💨 -> Код исполняется Произошла ошибка: 🚗💥🔧 -> Ошибка!

Python
Скопировать код
try:
    run_your_code()
except Exception:
    trigger_debugger()

Также, как подушки безопасности срабатывают при аварии, отладчик помогает расследовать произошедшее и устранить проблему.

Подушка безопасности отладчика: 🛑🔧

  • Активируется при ошибке в коде
  • Облегчает процесс отладки
  • Позволяет быстро обнаружить проблему

Совершенствуем навыки в отладке

Выбираем подходящий инструмент: IPython

Используйте IPython для более продуктивной отладки с функциями подсветки синтаксиса и автодополнения.

Специализированная отладка по типам ошибок

Настройте обработку исключений для конкретных типов ошибок:

Python
Скопировать код
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.

Python
Скопировать код
if os.getenv('DEBUG'):
    sys.excepthook = handle_exception

Продвинутые приемы отладки

Используйте продвинутые функциональные возможности отладчика, включая условные точки останова и удаленную отладку.

Полезные материалы

  1. pdb — The Python Debugger — Python 3.12.1 documentation – официальная документация Python по pdb
  2. Starting python debugger automatically on error – Stack Overflowобсуждение автоматического запуска отладчика на Stack Overflow
  3. sys — System-specific parameters and functions — Python 3.12.1 documentation – информация о sys.excepthook в документации Python
  4. Python Exception Handling Techniques · Doug Hellmann – обзор практик обработки исключений в Python
  5. Jupyter and the future of IPython — IPython – ресурс для знакомства с IPython