Теория
Что сообщает Python
Сообщение об ошибке — это не оценка программы и не требование переписать всё заново. Python показывает место, где он не смог продолжить, называет тип ошибки и добавляет короткое объяснение. Эти части помогают проверить одну конкретную причину.
Есть два частых момента остановки. При ошибке синтаксиса Python не может разобрать запись программы и не начинает её выполнять. При других исключениях программа уже запустилась, дошла до некоторой строки и столкнулась с недопустимой операцией или значением.
main.pyиline 2показывают, где программа остановилась.NameErrorназывает тип ошибки.- Текст после двоеточия уточняет причину: имя
totalне было определено.
Как читать traceback снизу вверх
Сообщение о необработанной ошибке во время выполнения называется traceback. В длинной программе в нём может быть несколько строк с файлами и вызовами. Пока мы работаем с одним небольшим файлом, достаточно начать с конца и подняться к ближайшей строке своего кода.
Traceback (most recent call last): File "main.py", line 2, in <module> print(total) ^^^^^NameError: name 'total' is not defined- Прочитайте последнюю строку. До двоеточия стоит тип ошибки, после него — пояснение причины.
- Найдите строку своего файла. Фрагмент File показывает имя файла, а line — номер строки.
- Сопоставьте код и пояснение. Проверьте только названное имя, операцию, значение или знак рядом с указанным местом.
Когда возникает SyntaxError
SyntaxError означает, что запись программы не соответствует правилам Python. Интерпретатор ещё не выполняет команды: сначала ему нужно понять структуру кода. В сообщении показывается строка и указатель примерно под местом, где разбор перестал быть возможен.
score = 10if score >= 10 print("зачёт")Вторая строка должна заканчиваться двоеточием: if score >= 10:. Указатель помогает найти место, но причину всё равно нужно проверить по правилу конструкции.
Почему появляется NameError
NameError появляется во время выполнения, когда Python встречает имя, которому ещё не присвоено значение. Частая причина — опечатка: переменная создана под одним именем, а ниже записана немного иначе.
number = 6if number > 0: print(nubmer * 2)Программа доходит до третьей строки и ищет имя nubmer. Такого имени нет. Сравнение с первой строкой показывает исправление: в print нужно написать number.
Чем TypeError отличается от ValueError
TypeError сообщает, что операция получила неподходящий вид данных. Например, input()возвращает строку, и Python не складывает её с числом без явного преобразования.
age = input()print(age + 1)ValueError означает другую ситуацию: вид данных подходит операции, но конкретное содержимое использовать нельзя. Функция int принимает строку, однако строка "семь" не записывает целое число цифрами.
number = int("семь")- В
age + 1участвуют строка и число — для сложения это неподходящее сочетание типов, поэтому возникаетTypeError. - В
int("семь")передана допустимая строка, но её содержимое нельзя прочитать как целое число. - Поэтому второй пример завершается
ValueError.
Как исправлять без догадки
Исправление подтверждается не исчезновением красного текста в редакторе, а новым запуском программы с понятным ожидаемым результатом. Меняйте одну предполагаемую причину за раз: иначе трудно понять, какое изменение действительно помогло.
- Назовите тип и место ошибки. Прочитайте последнюю строку и найдите ближайшую строку своего файла.
- Сформулируйте одну причину. Например: пропущено двоеточие, имя написано иначе или строка складывается с числом.
- Измените только связанную часть. Не переписывайте соседние команды, если сообщение на них не указывает.
- Запустите тот же пример снова. Сравните фактический вывод с тем, который ожидали получить.
Практика
Прочитайте последнюю строку
Последняя строка кратко называет остановку.
- Смотрим на часть до двоеточия.
- Там написано NameError — это тип ошибки.
- Часть после двоеточия поясняет причину: имя total не определено.
Найдите строку и тип ошибки
Соединяем место и причину.
- Фрагмент line 2 указывает на вторую строку файла main.py.
- Последняя строка начинается с TypeError.
- Ответ можно записать как 2 TypeError.
Исправьте заголовок условия
После условия в заголовке if нужно двоеточие: `if score >= 10:`. Только затем на следующей строке начинается блок с отступом.
Определите ошибку преобразования
Тип аргумента подходит, значение — нет.
- int умеет принимать строку, поэтому сама строка здесь допустима.
- Текст «семь» не записан цифрами и не превращается в целое число.
- Python останавливается с ValueError.
Исправьте программу и запустите снова
Исправляем причину, а не скрываем сообщение.
- Первый запуск доходит до print и сообщает NameError для имени nubmer.
- Выше создана переменная number, значит в print переставлены две буквы.
- После замены nubmer на number и повторного ввода 6 программа печатает 12.
Исправленный вариант программы
number = int(input())if number > 0: print(number * 2)Итог
Теперь вы можете разобрать базовое сообщение Python на место, тип и пояснение причины. Вы умеете отличать ошибку записи программы от ошибки во время выполнения и знаете, что проверить при NameError, TypeError и ValueError.
Возьмите одну из своих недавних программ и намеренно измените имя переменной. Прочитайте новое сообщение снизу вверх, верните правильное имя и убедитесь повторным запуском, что программа снова выдаёт ожидаемый результат.
Прогресс
0 / 5Вы ещё не решали задания