Отладка и обработка ошибок в ноутбуке
Содержание курса
Ошибки и 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.
При возникновении ошибки:
-
Прочитайте тип ошибки и сообщение. В нашем примере NameError явно говорит – переменная y не определена. Часто распространённые ошибки:
-
NameError– опечатка или забыли определение переменной. -
TypeError– неверный тип объекта для операции (например, вы пытаетесь сделатьlen(5)– 5 это int, у него нет длины). -
IndexError– индекс вышел за границы последовательности (например, попросили 10-й элемент списка длины 5). -
KeyError– нет такого ключа в словаре или столбца в DataFrame. -
AttributeError– нет такого атрибута/метода у объекта (может, опечатка в названии метода). -
ValueError– функция получила аргумент правильного типа, но некорректного значения (например, math.sqrt(-1) бросит ValueError, так как ожидалось неотрицательное). -
IndentationError– ошибка отступов (внутри блока код отступлен неправильно). -
SyntaxError– синтаксическая ошибка (опечатка в коде, неправильная конструкция).
-
-
Просмотрите стек (Traceback). Если у вас многоуровневый вызов функций, traceback может быть длинным, указывая последовательность вызовов. Последняя (нижняя) часть – причина, выше – места, откуда эта ошибка пошла. Обычно интересует именно место в вашем коде, где проблема. Библиотечные вызовы можно сначала пропустить.
В Jupyter, к сожалению, номера строк – относительные к ячейке (в примере <ipython-input-7> – 7-я ячейка, line 2 внутри неё). Но вы видите сам код со стрелкой, этого достаточно.
После идентификации проблемы – переходим к исправлению. Иногда достаточно по сообщению понять (ах да, y не объявлен, нужно определение). Иногда сложнее – тогда переходим к отладке.
