Научись разбирать сообщение об ошибке вместо того, чтобы его закрывать: тип, файл, строка и стек вызовов.
Открыть этот урок в KodokonОшибка - это не наказание. Компьютер тебя не осуждает и не смеётся над тобой: он заметил, что не знает, что делать, и объясняет почему. Это работает ровно как навигатор, который объявляет «маршрут пересчитывается»: это не упрёк, это информация. Рефлекс новичка - закрыть красное окно, не читая. Рефлекс разработчика - прочитать его медленно и до самого конца. Часто это единственный момент, когда машина говорит с тобой человеческими словами.
Почти в каждом сообщении об ошибке есть один и тот же набор сведений. Тип ошибки, который относит её к большому семейству. Сообщение, которое одной фразой объясняет, что не так. Файл и номер строки, которые точно указывают, куда смотреть. И иногда стек вызовов (по-английски stack trace): список шагов, которые программа прошла, прежде чем сломаться.
Traceback (most recent call last):
File "shopping.py", line 12, in <module>
total = price * quantity
NameError: name 'quantity' is not definedВ примере выше сказано всё. Файл - shopping.py, строка - 12, тип - NameError, а сообщение гласит name 'quantity' is not defined, то есть «имя quantity не определено». Простыми словами: в строке 12 ты используешь переменную quantity, которую никогда не создавал или в имени которой ошибся. Никакого сложного расследования не нужно - ответ уже был в самом сообщении.
Стек вызовов в Python читается снизу вверх: последняя строка даёт тип и объяснение, а прямо над ней стоят файл и виноватая строка. Когда стек очень длинный, ищи первую строку, где упоминается твой собственный файл. Строки с незнакомыми файлами и странными именами относятся к библиотекам, которыми ты пользуешься: в 99 % случаев баг не в них, а в том, как ты их вызываешь.
Uncaught TypeError: Cannot read properties of
undefined (reading 'name')
at showProfile (app.js:24:18)
at start (app.js:41:3)Несколько формулировок встречаются постоянно, и их выгодно узнавать в лицо. not defined означает, что использованное имя в этом месте не существует. undefined значит, что объект есть, но значения у него нет. unexpected говорит, что программа ожидала другого, обычно это забытая скобка или кавычка. permission denied указывает на проблему с правами, а не с кодом. А no such file or directory означает, что написанный тобой путь никуда не ведёт.
not defined?