v1.0.0

Python с нуля для ЕГЭ · Ошибки: читаем сообщение и находим причину

Урок курсаPython 35 задачБесплатно

Ошибки: читаем сообщение и находим причину

Разберём, как читать сообщение Python снизу вверх, находить строку остановки и отличать несколько частых причин ошибки.

Теория

Что сообщает Python

Сообщение об ошибке — это не оценка программы и не требование переписать всё заново. Python показывает место, где он не смог продолжить, называет тип ошибки и добавляет короткое объяснение. Эти части помогают проверить одну конкретную причину.

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

Разберём на примере
Сначала отделим место от причины
В сообщении есть строка File «main.py», line 2 и финальная строка NameError: name 'total' is not defined.
  1. main.py и line 2показывают, где программа остановилась.
  2. NameError называет тип ошибки.
  3. Текст после двоеточия уточняет причину: имя total не было определено.

Как читать traceback снизу вверх

Сообщение о необработанной ошибке во время выполнения называется traceback. В длинной программе в нём может быть несколько строк с файлами и вызовами. Пока мы работаем с одним небольшим файлом, достаточно начать с конца и подняться к ближайшей строке своего кода.

Traceback (most recent call last):  File "main.py", line 2, in <module>    print(total)          ^^^^^NameError: name 'total' is not defined
Как действовать
Читаем сообщение в рабочем порядке
  1. Прочитайте последнюю строку. До двоеточия стоит тип ошибки, после него — пояснение причины.
  2. Найдите строку своего файла. Фрагмент File показывает имя файла, а line — номер строки.
  3. Сопоставьте код и пояснение. Проверьте только названное имя, операцию, значение или знак рядом с указанным местом.
Проверьте себя
С какой части traceback полезнее начать, если сообщение занимает несколько строк?
С последней строки: она называет тип ошибки и краткую причину. Затем поднимитесь к строке своего файла.

Когда возникает SyntaxError

SyntaxError означает, что запись программы не соответствует правилам Python. Интерпретатор ещё не выполняет команды: сначала ему нужно понять структуру кода. В сообщении показывается строка и указатель примерно под местом, где разбор перестал быть возможен.

score = 10if score >= 10    print("зачёт")

Вторая строка должна заканчиваться двоеточием: if score >= 10:. Указатель помогает найти место, но причину всё равно нужно проверить по правилу конструкции.

Почему появляется NameError

NameError появляется во время выполнения, когда Python встречает имя, которому ещё не присвоено значение. Частая причина — опечатка: переменная создана под одним именем, а ниже записана немного иначе.

number = 6if number > 0:    print(nubmer * 2)

Программа доходит до третьей строки и ищет имя nubmer. Такого имени нет. Сравнение с первой строкой показывает исправление: в print нужно написать number.

Проверьте себя
Что проверить первым при сообщении NameError: name 'result' is not defined?
Найдите место, где result должно было получить значение, и сравните написание имени в обеих строках.

Чем TypeError отличается от ValueError

TypeError сообщает, что операция получила неподходящий вид данных. Например, input()возвращает строку, и Python не складывает её с числом без явного преобразования.

age = input()print(age + 1)

ValueError означает другую ситуацию: вид данных подходит операции, но конкретное содержимое использовать нельзя. Функция int принимает строку, однако строка "семь" не записывает целое число цифрами.

number = int("семь")
Разберём на примере
Различим две причины
Сравним age + 1 и int(«семь»).
  1. В age + 1 участвуют строка и число — для сложения это неподходящее сочетание типов, поэтому возникает TypeError.
  2. В int("семь") передана допустимая строка, но её содержимое нельзя прочитать как целое число.
  3. Поэтому второй пример завершается ValueError.
Проверьте себя
Почему int(«12») работает, а int(«двенадцать») завершается с ValueError?
Обе записи — строки, но только «12» содержит допустимую цифровую запись целого числа.

Как исправлять без догадки

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

Как действовать
Короткий цикл исправления
  1. Назовите тип и место ошибки. Прочитайте последнюю строку и найдите ближайшую строку своего файла.
  2. Сформулируйте одну причину. Например: пропущено двоеточие, имя написано иначе или строка складывается с числом.
  3. Измените только связанную часть. Не переписывайте соседние команды, если сообщение на них не указывает.
  4. Запустите тот же пример снова. Сравните фактический вывод с тем, который ожидали получить.
Проверьте себя
Какой порядок действий помогает перейти от длинного сообщения к проверенному исправлению?
Прочитать последнюю строку, найти строку своего файла, связать тип и пояснение с одной причиной, изменить связанную часть и запустить пример снова.

Практика

Прочитайте последнюю строку

Python остановился с сообщением NameError: name 'total' is not defined. Как называется тип ошибки?

Подсказка
Тип стоит до двоеточия в последней строке сообщения.
Решение

Последняя строка кратко называет остановку.

  1. Смотрим на часть до двоеточия.
  2. Там написано NameError — это тип ошибки.
  3. Часть после двоеточия поясняет причину: имя total не определено.

В traceback указано: File "main.py", line 2, затем print(age + 1) и TypeError: can only concatenate str (not "int") to str. Запишите номер строки и тип ошибки через пробел.

Подсказка
Номер находится после слова line, а тип — до двоеточия в последней строке.
Решение

Соединяем место и причину.

  1. Фрагмент line 2 указывает на вторую строку файла main.py.
  2. Последняя строка начинается с TypeError.
  3. Ответ можно записать как 2 TypeError.

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

В строке if score >= 10 Python показывает SyntaxError. Какой один знак нужно добавить в конец строки?

Подсказка
Вспомните, чем заканчивается заголовок ветви if перед блоком с отступом.
Решение

После условия в заголовке if нужно двоеточие: `if score >= 10:`. Только затем на следующей строке начинается блок с отступом.

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

Программа выполняет number = int("семь"). Какой тип ошибки появится?

Подсказка
Функция int получает строку, но её содержимое нельзя прочитать как целое число.
Решение

Тип аргумента подходит, значение — нет.

  1. int умеет принимать строку, поэтому сама строка здесь допустима.
  2. Текст «семь» не записан цифрами и не превращается в целое число.
  3. Python останавливается с ValueError.

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

Создайте программу из трёх строк: number = int(input()), затем if number > 0:, затем с отступом print(nubmer * 2). Запустите её с числом 6, прочитайте ошибку, исправьте только неверное имя и перенесите сюда результат повторного запуска.

Подсказка
В последней строке сообщения найдите имя, которого нет среди созданных переменных. Сравните nubmer и number буква за буквой.
Решение

Исправляем причину, а не скрываем сообщение.

  1. Первый запуск доходит до print и сообщает NameError для имени nubmer.
  2. Выше создана переменная number, значит в print переставлены две буквы.
  3. После замены nubmer на number и повторного ввода 6 программа печатает 12.

Исправленный вариант программы

number = int(input())if number > 0:    print(number * 2)

Итог

Теперь вы можете разобрать базовое сообщение Python на место, тип и пояснение причины. Вы умеете отличать ошибку записи программы от ошибки во время выполнения и знаете, что проверить при NameError, TypeError и ValueError.

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

Прогресс

0 / 5
x

Вы ещё не решали задания