Коли виконується блок catch?
Коротка відповідь
Блок catch виконується лише тоді,
коли в блоці try виникла помилка (виняток) -
або кинута вручну (throw), або автоматично (наприклад, ReferenceError, TypeError і т. д.).
Якщо код усередині try виконався без помилок - catch пропускається.
Покроковий механізм роботи
- Код усередині
try { ... }починає виконуватися порядково. - Якщо в ньому не виникає помилок,
catchне викликається. - Якщо всередині
tryсталася помилка, виконанняtryнегайно переривається, і керування переходить уcatch. - У
catch(error)доступний об'єкт помилки, який можна обробити або вивести.
Приклад 1. Помилки немає -> catch не спрацьовує
try {
console.log("Все працює чудово!");
} catch (error) {
console.log("Спіймали помилку:", error.message);
}
console.log("Продовжуємо виконання...");Вивід:
Все працює чудово!
Продовжуємо виконання...Оскільки всередині
tryне було помилок -catchне виконується.
Приклад 2. Помилка є -> catch виконується
try {
console.log("Початок");
throw new Error("Сталася помилка!");
console.log("Цей код не виконається");
} catch (error) {
console.log("Спіймали:", error.message);
}Вивід:
Початок
Спіймали: Сталася помилка!Після
throwвиконанняtryприпиняється, і керування передається вcatch.
Приклад 3. Автоматична помилка
try {
console.log(a); // ReferenceError: a is not defined
} catch (error) {
console.log("Спіймали:", error.name); // ReferenceError
}Тут
catchспрацьовує, тому що JS автоматично кинув виняток при зверненні до неіснуючої змінної.
Приклад 4. Кілька рядків - помилка "обриває" try
try {
console.log("1");
JSON.parse("not valid JSON"); // помилка тут
console.log("2"); // не виконається
} catch (error) {
console.log("Спіймали:", error.message);
}
console.log("3");Вивід:
1
Спіймали: Unexpected token n in JSON at position 0
3Щойно сталася помилка,
tryпереривається, і виконуєтьсяcatch.
Приклад 5. Помилка поза try - catch не спрацьовує
try {
console.log("Все добре всередині try");
} catch (error) {
console.log("Спіймали помилку:", error.message);
}
throw new Error("Помилка поза try!"); // не перехопитьсяПомилка не буде спіймана, тому що сталася поза блоком try.
Приклад 6. Помилка всередині асинхронного коду
Важливо:
try...catchне ловить помилки всередині колбеків і промісів, якщо не використовуватиawaitабоcatch().
try {
setTimeout(() => {
throw new Error("Помилка в колбеку"); // не спіймається
}, 1000);
} catch (e) {
console.log("Спіймано:", e.message);
}Щоб ловити помилки з промісів - потрібно використовувати
async/awaitабо.catch():
Правильно:
async function run() {
try {
await Promise.reject(new Error("Помилка в промісі"));
} catch (e) {
console.log("Спіймали:", e.message);
}
}
run();Приклад 7. Якщо помилок кілька - ловиться перша
try {
throw new Error("Помилка 1");
throw new Error("Помилка 2"); // не виконається
} catch (err) {
console.log("Спіймана:", err.message);
}Вивід:
Спіймана: Помилка 1Підсумок
| Ситуація | Чи виконується catch? | Причина |
|---|---|---|
У try немає помилок | Ні | Код відпрацював нормально |
У try кинуто throw | Так | Виняток оброблено |
| JS сам кинув помилку (ReferenceError тощо) | Так | Автоматична помилка |
Помилка поза try | Ні | Не входить у область обробки |
| Помилка в колбеку/Promise без await | Ні | Асинхронний код поза try |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.