Продвинутые возможности

Отладка и обработка ошибок в ноутбуке

Содержание курса

Интерактивная отладка с %debug

IPython имеет очень удобную функцию: магия %debug. Она позволяет войти в интерактивный режим отладки после того, как произошла ошибка.

Допустим, другая функция:

def divide(a, b):
    result = a / b
    return result

x = 10
y = 0
divide(x, y)

При выполнении возникнет ZeroDivisionError. Traceback укажет на строку result = a / b. Чтобы исследовать состояние программы в момент ошибки, сразу после появления traceback в той же среде выполните:

%debug

Вы попадёте в встроенный отладчик pdb, в контекст той строки, где случилась ошибка. В Jupyter это происходит прямо в ячейке (появится промпт ipdb>). Вы можете:

  • Посмотреть значения переменных: напишите a и Enter (выведет 10), b (выведет 0).

  • Понять причину: явно b=0, деление на ноль.

  • В pdb доступны команды: l (list код вокруг текущей позиции), u (up) подняться на уровень выше (вызвавшая функция), d (down) спуститься обратно, q (quit) выйти из отладчика.

В данном примере код простой, но представьте, ошибка в глубине вызовов – %debug переносит вас прямо туда. Вы можете исследовать локальные переменные, шагать по коду (команды n, s – next, step), но чаще в post-mortem режиме (после упавшей ошибки) вы просто осматриваетесь.

Полезно: %debug можно вставлять и в код, обернув подозрительный участок в try/except:

python

КопироватьРедактировать

try: complicated_function(data) except Exception as e: print("Ошибка:", e) %debug

Это поймает любую ошибку в complicated_function и сразу запустит отладчик на месте.

Чтобы автоматически входить в отладчик при любой ошибке, можно выполнить %pdb on (Persistent Debug). Тогда при каждой ошибке будет как будто автоматически вызываться %debug. %pdb off отключает.

JupyterLab Debugger: В JupyterLab, если вы используете ядро IPykernel 5.3+ и JupyterLab 3+, есть графический отладчик (с брейкпоинтами). Нужно в Notebook включить режим debug (иконка жука). Это удобнее для сложной отладки: можно щёлкать брейкпоинты на строках, запускать ячейку – выполнение остановится на брейкпоинте, и в sidebar Lab вы увидите стек, переменные, и сможете шагать по коду. Имейте в виду, не все ядра поддерживают (для Python используйте ipykernel, а не, например, IRkernel).

Совместное использование с IDE: Иногда разработчики пишут код в ноутбуке, а отлаживают в IDE. Можно, например, вставить import pdb; pdb.set_trace() – это встроенный вызов отладчика pdb, он тоже откроет интерактивную отладку (но в консоли, что в Jupyter выглядит так же, как %debug). Однако лучше использовать %debug прямо.

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

try:
    complicated_function(data)
except Exception as e:
    print("Ошибка:", e)
    %debug

Это не отладка, а программная обработка – чтобы ноутбук не останавливал выполнение и продолжил с заданным поведением. Применяйте, если ожидаете определённые ошибки и хотите их учесть.

Резюме: Отладка – неотъемлемая часть разработки. В Jupyter у вас сочетание: прочитать traceback, добавить print/логов, использовать %debug для глубокого копания. Такой цикл позволяет исправлять ошибки очень быстро. Важно писать код небольшими кусочками и тестировать их в ноутбуке, тогда вы ловите ошибки рано и с меньшим контекстом.

На будущее: Чем опытнее вы становитесь, тем больше будете предусматривать типичные ошибки (и, например, писать проверки if b == 0: ...). А инструменты Jupyter всегда под рукой для поиска причины неожиданных ситуаций.

Полезный совет: храните ноутбук в чистом состоянии – периодически делайте Restart & Run All. Если после этого всё работает – ваш код самодостаточен и последовательно. Это защищает от ситуаций, когда "работает, пока не перезапустишь kernel" из-за скрытых зависимостей.

Как найти ошибку из-за порядка запуска ячеек

В ноутбуке выполните ячейку x = 10, затем измените её текст на x = 20, но не запускайте. Другая ячейка по-прежнему увидит старое значение 10. Видимый код и состояние kernel теперь расходятся. Это отличается от ошибки Python в самой формуле.

Перезапустите kernel и выполните ячейки последовательно сверху вниз. Если после этого появился NameError, раньше переменная существовала только благодаря скрытому состоянию прошлых запусков. Перенесите определение выше использования и повторите проверку с чистым kernel. Если значение зависит от файла, отдельно убедитесь, что файл доступен в текущем рабочем каталоге.

Перед отправкой ноутбука другому человеку проверьте полный запуск с чистого состояния. Удаление вывода ячейки не очищает память kernel. Выполненная ячейка с красивым графиком не доказывает воспроизводимости остальных результатов.

Продолжите разбор: Магические команды IPython: обзор.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения. Преподаватель получит доступ к диалогу, когда вы попросите его помочь.

Проверка решения остаётся отдельным действием.

Отладка и обработка ошибок в ноутбуке — Jupyter Notebook с нуля: бесплатный курс — Latorn