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

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

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

Ошибки и Traceback: чтение сообщений об ошибках

При разработке код часто содержит ошибки. В Jupyter, если при выполнении ячейки произошло неперехваченное исключение, вы увидите traceback – многострочное сообщение об ошибке (красного цвета).

Пример:

x = 5 
print("Результат:", x * y)

Если переменная y не определена, то при выполнении мы получим вывод:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-4c2...> in <module>
      1 x = 5
----> 2 print("Результат:", x * y)

NameError: name 'y' is not defined

Разберём его:

  • Строчки с --------------------------------------------------------------------------- обрамляют traceback.

  • NameError – тип исключения.

  • Далее IPython показывает стек вызовов: здесь простой случай – прямо в модуле <module> (то есть в самой ячейке, вне функций), на строке со стрелкой произошла ошибка.

  • Стрелка ----> указывает на строку print("Результат:", x * y). Номер строки (в данном случае 2 в ячейке) и контекст.

  • Последняя строчка – описание ошибки: name 'y' is not defined.

При возникновении ошибки:

  1. Прочитайте тип ошибки и сообщение. В нашем примере NameError явно говорит – переменная y не определена. Часто распространённые ошибки:

    • NameError – опечатка или забыли определение переменной.

    • TypeError – неверный тип объекта для операции (например, вы пытаетесь сделать len(5) – 5 это int, у него нет длины).

    • IndexError – индекс вышел за границы последовательности (например, попросили 10-й элемент списка длины 5).

    • KeyError – нет такого ключа в словаре или столбца в DataFrame.

    • AttributeError – нет такого атрибута/метода у объекта (может, опечатка в названии метода).

    • ValueError – функция получила аргумент правильного типа, но некорректного значения (например, math.sqrt(-1) бросит ValueError, так как ожидалось неотрицательное).

    • IndentationError – ошибка отступов (внутри блока код отступлен неправильно).

    • SyntaxError – синтаксическая ошибка (опечатка в коде, неправильная конструкция).

  2. Просмотрите стек (Traceback). Если у вас многоуровневый вызов функций, traceback может быть длинным, указывая последовательность вызовов. Последняя (нижняя) часть – причина, выше – места, откуда эта ошибка пошла. Обычно интересует именно место в вашем коде, где проблема. Библиотечные вызовы можно сначала пропустить.

В Jupyter, к сожалению, номера строк – относительные к ячейке (в примере <ipython-input-7> – 7-я ячейка, line 2 внутри неё). Но вы видите сам код со стрелкой, этого достаточно.

После идентификации проблемы – переходим к исправлению. Иногда достаточно по сообщению понять (ах да, y не объявлен, нужно определение). Иногда сложнее – тогда переходим к отладке.

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

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

О переписке

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

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

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