Перейти к содержимому
Теория · Первая программа · урок 2 из 7

Ошибки в программе

В прошлом уроке программа остановилась на слове Hello без кавычек. Вернёмся к повару и рецепту: повар может остановиться по двум разным причинам.

  • Ещё до начала работы он читает рецепт целиком и натыкается на фразу, которую невозможно понять, например оборванную на середине. Тогда он не выполняет ни одного шага.
  • Он уже готовит и доходит до шага «добавьте соус», а соуса на кухне нет. Шаги до этого сделаны, а дальше работа встаёт.

В JavaScript есть ошибки обоих видов. Начнём со второго: программа может остановиться на середине. Во второй строке этой программы стоит имя total, но программа нигде не задаёт, что оно значит:

JavaScript
console.log("start"); // start
console.log(total); // ✗
console.log("end");
TEXT
ReferenceError: total is not defined

Программа выполнилась так:

  1. Первая строка напечатала start.
  2. Вторая строка остановила программу с ошибкой.
  3. Третья строка написана верно, но не выполнилась, и end не напечатано.

Ошибка выполнения

ReferenceError — это ошибка выполнения: Node.js обнаруживает её, только когда доходит до строки с ней. Строки выше к этому моменту уже выполнились, а строки ниже не выполнятся.

Вместо неизвестного имени JavaScript не подставляет пустое значение undefined и не пропускает строку. Он останавливает программу. Здесь картинка с поваром перестаёт работать: настоящий повар пропустил бы шаг или заменил соус чем-то другим.

Сообщение об ошибке выполнения всегда говорит только о первой такой ошибке: до следующих программа уже не доходит.

Синтаксическая ошибка

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

JavaScript
console.log("start");
console.log("end"; // ✗
TEXT
SyntaxError: missing ) after argument list

Это синтаксическая ошибка, и на этот раз не напечатано даже start. Чаще всего синтаксическую ошибку вызывают:

  • незакрытая скобка;
  • незакрытая кавычка;
  • пропущенная запятая между значениями.

Как отличить одну от другой

На собеседовании часто спрашивают: «Чем синтаксическая ошибка отличается от ошибки выполнения?» Разница в том, когда Node.js находит ошибку:

  • синтаксическую — до запуска, поэтому не выполняется ни одна строка;
  • ошибку выполнения — когда программа доходит до её строки, поэтому строки выше уже выполнились.

По выводу видно, какая из двух ошибок случилась: если первые строки успели что-то напечатать, это ошибка выполнения.

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

Об ошибке Node.js печатает несколько строк:

  1. Путь к файлу и номер строки с ошибкой, например errors.js:2.
  2. Сама строка кода, а под ней знаки ^, которые указывают на место ошибки.
  3. Главное — название ошибки и её описание: ReferenceError: total is not defined.
  4. Строки, которые начинаются с at, показывают, где внутри Node.js выполнялся файл. В первых программах их можно не читать.

Слова is not defined переводятся как «не определено»: программа нигде не задала, что значит это имя. В уроках курса от сообщения остаётся только строка с названием и описанием, как в примерах выше.

Частая ошибка

JavaScript различает большие и маленькие буквы. Для него Console и console — два разных имени, и первое программа нигде не задала:

JavaScript
Console.log("Hello"); // ✗
TEXT
ReferenceError: Console is not defined

Исправление — написать имя так же, как в примерах: console.log.

Главное

  • Синтаксическую ошибку Node.js находит до запуска, и не выполняется ни одна строка.
  • Ошибку выполнения, например ReferenceError, Node.js находит только на её строке: строки выше уже выполнились, а ниже — нет.
  • Главная строка сообщения — название ошибки и описание, например ReferenceError: total is not defined.
  • JavaScript различает большие и маленькие буквы, поэтому Console и console — разные имена.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом