Kodokon kodokon.com

Как читать и понимать сообщение об ошибке

Научись разбирать сообщение об ошибке вместо того, чтобы его закрывать: тип, файл, строка и стек вызовов.

8 мин · 3 вопросов

Открыть этот урок в Kodokon

Ошибка - это не наказание. Компьютер тебя не осуждает и не смеётся над тобой: он заметил, что не знает, что делать, и объясняет почему. Это работает ровно как навигатор, который объявляет «маршрут пересчитывается»: это не упрёк, это информация. Рефлекс новичка - закрыть красное окно, не читая. Рефлекс разработчика - прочитать его медленно и до самого конца. Часто это единственный момент, когда машина говорит с тобой человеческими словами.

Почти в каждом сообщении об ошибке есть один и тот же набор сведений. Тип ошибки, который относит её к большому семейству. Сообщение, которое одной фразой объясняет, что не так. Файл и номер строки, которые точно указывают, куда смотреть. И иногда стек вызовов (по-английски stack trace): список шагов, которые программа прошла, прежде чем сломаться.

PYTHON
Traceback (most recent call last):
  File "shopping.py", line 12, in <module>
    total = price * quantity
NameError: name 'quantity' is not defined
Сообщение Python: файл, строка 12, тип NameError и его объяснение.

В примере выше сказано всё. Файл - shopping.py, строка - 12, тип - NameError, а сообщение гласит name 'quantity' is not defined, то есть «имя quantity не определено». Простыми словами: в строке 12 ты используешь переменную quantity, которую никогда не создавал или в имени которой ошибся. Никакого сложного расследования не нужно - ответ уже был в самом сообщении.

Стек вызовов в Python читается снизу вверх: последняя строка даёт тип и объяснение, а прямо над ней стоят файл и виноватая строка. Когда стек очень длинный, ищи первую строку, где упоминается твой собственный файл. Строки с незнакомыми файлами и странными именами относятся к библиотекам, которыми ты пользуешься: в 99 % случаев баг не в них, а в том, как ты их вызываешь.

JAVASCRIPT
Uncaught TypeError: Cannot read properties of
undefined (reading 'name')
    at showProfile (app.js:24:18)
    at start (app.js:41:3)
Та же логика в консоли браузера: файл app.js, строка 24, столбец 18.

Несколько формулировок встречаются постоянно, и их выгодно узнавать в лицо. not defined означает, что использованное имя в этом месте не существует. undefined значит, что объект есть, но значения у него нет. unexpected говорит, что программа ожидала другого, обычно это забытая скобка или кавычка. permission denied указывает на проблему с правами, а не с кодом. А no such file or directory означает, что написанный тобой путь никуда не ведёт.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Какая часть сообщения об ошибке подсказывает, куда смотреть в первую очередь?
    • Имя файла и номер строки
    • Цвет текста на экране
    • Общая длина сообщения
    • Название твоей операционной системы
  2. В каком направлении читается стек вызовов в Python?
    • Сверху вниз: первая строка даёт решение
    • Снизу вверх: последняя строка даёт тип и объяснение
    • В любом, он нужен просто для красоты
  3. Что обычно означает ошибка со словами not defined?
    • Использованное имя не существует в этом месте программы
    • Файл слишком большой, чтобы его открыть
    • Интернет-соединение было прервано