Синтаксична помилка проти runtime-помилки
Синтаксична помилка, це помилка структури коду, яку рушій знаходить на етапі парсингу, ще до виконання, а runtime-помилка виникає вже під час роботи синтаксично коректного коду. Різниця практична: перша не дає програмі запуститися взагалі, другу можна перехопити через try...catch і продовжити роботу.
Теорія
TL;DR
SyntaxErrorна етапі парсингу означає, що рушій не може навіть розібрати код.- Такий файл не виконається жодним рядком, тому
try...catchусередині нього марний. - Runtime-помилка виникає після успішної перевірки синтаксису, коли логіка призводить до збою.
- Типові runtime-помилки:
ReferenceError,TypeError,RangeError. - Runtime-помилку можна спіймати в
try...catchі відновити роботу програми. JSON.parse()може кинутиSyntaxErrorсаме під час виконання, тому цей випадок перехоплюється нормально.
Швидкий приклад
// Синтаксична помилка: пропущена дужка, код не запуститься
if (true {
console.log("ok");
}
// Runtime-помилка: код запустився і зламався на цьому рядку
console.log(a); // ReferenceError: a is not definedЩо таке синтаксична помилка
Синтаксична помилка (SyntaxError), це помилка, що виникає ще до запуску програми, коли JavaScript не може розібрати код, бо в ньому порушені правила синтаксису мови. Простіше кажучи: код не можна навіть почати виконувати.
Приклади:
if (true { // пропущена дужка
console.log("ok");
}function() { // функція без імені
console.log("hi");
}const a = ; // після "=" немає значенняТакі помилки інтерпретатор виявляє на етапі парсингу, до виконання, тому код не запуститься взагалі.
Наочний приклад з поясненням:
console.log("до помилки");
eval("let x = ;"); // SyntaxError
console.log("після помилки"); // не виконаєтьсяПомилка виникає одразу при спробі інтерпретувати рядок, тому до другого console.log програма не дійде.
Що таке runtime-помилка
Runtime-помилка, це помилка часу виконання: вона виникає під час роботи програми, уже після того, як код успішно пройшов перевірку синтаксису. Тобто синтаксис коректний, але логіка програми призводить до збою.
Приклади:
console.log(a); // ReferenceError: a is not definedlet obj = null;
obj.name; // TypeError: Cannot read properties of nullJSON.parse("{ not valid json }"); // SyntaxError, але кинута під час виконанняУ цих випадках код запускається, але ламається на певному рядку під час виконання. Останній приклад показує важливий нюанс: тип помилки називається SyntaxError, проте вона стосується розбору рядка з даними, а не вашого файлу, тому й виникає в рантаймі.
Головна різниця
| Критерій | Синтаксична помилка | Runtime-помилка |
|---|---|---|
| Коли виникає | На етапі парсингу, до запуску коду | Під час виконання програми |
Чи можна спіймати в try...catch | Ні, код навіть не запуститься | Так, можна обробити |
| Приклад | if (true { | console.log(a) |
| Реакція JS | Код не виконується взагалі | Виконання переривається на помилці |
| Тип помилки | SyntaxError | ReferenceError, TypeError, RangeError та інші |
Приклад для наочного порівняння
// Синтаксична помилка:
try {
eval("if (true { console.log('hi') }"); // некоректний синтаксис
} catch (e) {
console.log("Спіймали?", e.message);
}
// Тут помилка виникає при розборі рядка всередині eval,
// а справжня синтаксична помилка у самому файлі не дала б
// цьому коду запуститися взагалі.
// Runtime-помилка:
try {
console.log(a); // ReferenceError
} catch (e) {
console.log("Спіймали:", e.message);
}Підсумок
| Термін | Що означає |
|---|---|
| SyntaxError | Помилка у структурі коду, JS не може його інтерпретувати |
| Runtime Error | Помилка під час виконання синтаксично коректного коду |
| Різниця | Перша на етапі парсингу, друга на етапі виконання |
Типові помилки
- Сподіватися, що
try...catchзахистить від синтаксичної помилки у тому самому файлі. Парсер відхиляє файл цілком, тому блокtryнавіть не встигає з'явитися. - Плутати
SyntaxErrorвідJSON.parse()із помилкою розбору вашого коду. Перша виникає в рантаймі і чудово ловиться, друга ні. - Вважати, що редактор завжди покаже синтаксичну помилку. Підсвітка допомагає, але остаточна перевірка за рушієм, тому корисно тримати лінтер у CI.
- Гадати, що runtime-помилка ламає лише один рядок. Неспіймана помилка зупиняє весь поточний стек викликів, а не тільки проблемний вираз.
- Використовувати
eval()для перевірки коду. Це вносить проблеми з безпекою та продуктивністю; для розбору даних берітьJSON.parse(), а неeval().
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.