Ошибки в программе
В прошлом уроке программа остановилась на слове Hello без кавычек. Вернёмся к повару и рецепту: повар может остановиться по двум разным причинам.
- Ещё до начала работы он читает рецепт целиком и натыкается на фразу, которую невозможно понять, например оборванную на середине. Тогда он не выполняет ни одного шага.
- Он уже готовит и доходит до шага «добавьте соус», а соуса на кухне нет. Шаги до этого сделаны, а дальше работа встаёт.
В JavaScript есть ошибки обоих видов. Начнём со второго: программа может остановиться на середине. Во второй строке этой программы стоит имя total, но программа нигде не задаёт, что оно значит:
console.log("start"); // start
console.log(total); // ✗
console.log("end");ReferenceError: total is not definedПрограмма выполнилась так:
- Первая строка напечатала
start. - Вторая строка остановила программу с ошибкой.
- Третья строка написана верно, но не выполнилась, и
endне напечатано.
Ошибка выполнения
ReferenceError — это ошибка выполнения: Node.js обнаруживает её, только когда доходит до строки с ней. Строки выше к этому моменту уже выполнились, а строки ниже не выполнятся.
Вместо неизвестного имени JavaScript не подставляет пустое значение undefined и не пропускает строку. Он останавливает программу. Здесь картинка с поваром перестаёт работать: настоящий повар пропустил бы шаг или заменил соус чем-то другим.
Сообщение об ошибке выполнения всегда говорит только о первой такой ошибке: до следующих программа уже не доходит.
Синтаксическая ошибка
Ошибки другого вида Node.js находит ещё до запуска. Перед выполнением он читает файл целиком и проверяет, что текст соблюдает правила записи языка. Если, например, скобка не закрыта, не выполняется ни одна строка, даже первая:
console.log("start");
console.log("end"; // ✗SyntaxError: missing ) after argument listЭто синтаксическая ошибка, и на этот раз не напечатано даже start. Чаще всего синтаксическую ошибку вызывают:
- незакрытая скобка;
- незакрытая кавычка;
- пропущенная запятая между значениями.
Как отличить одну от другой
На собеседовании часто спрашивают: «Чем синтаксическая ошибка отличается от ошибки выполнения?» Разница в том, когда Node.js находит ошибку:
- синтаксическую — до запуска, поэтому не выполняется ни одна строка;
- ошибку выполнения — когда программа доходит до её строки, поэтому строки выше уже выполнились.
По выводу видно, какая из двух ошибок случилась: если первые строки успели что-то напечатать, это ошибка выполнения.
Как читать сообщение
Об ошибке Node.js печатает несколько строк:
- Путь к файлу и номер строки с ошибкой, например
errors.js:2. - Сама строка кода, а под ней знаки
^, которые указывают на место ошибки. - Главное — название ошибки и её описание:
ReferenceError: total is not defined. - Строки, которые начинаются с
at, показывают, где внутри Node.js выполнялся файл. В первых программах их можно не читать.
Слова is not defined переводятся как «не определено»: программа нигде не задала, что значит это имя. В уроках курса от сообщения остаётся только строка с названием и описанием, как в примерах выше.
Частая ошибка
JavaScript различает большие и маленькие буквы. Для него Console и console — два разных имени, и первое программа нигде не задала:
Console.log("Hello"); // ✗ReferenceError: Console is not definedИсправление — написать имя так же, как в примерах: console.log.
Главное
- Синтаксическую ошибку Node.js находит до запуска, и не выполняется ни одна строка.
- Ошибку выполнения, например
ReferenceError, Node.js находит только на её строке: строки выше уже выполнились, а ниже — нет. - Главная строка сообщения — название ошибки и описание, например
ReferenceError: total is not defined. - JavaScript различает большие и маленькие буквы, поэтому
Consoleиconsole— разные имена.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.