Що робить оператор throw
throw це оператор, який перериває виконання поточного коду і викидає виняток: помилку або будь-який інший об'єкт. Він перетворює звичайне значення на подію помилки, яку далі ловить try...catch, а якщо ловити нікому, виняток спливає по стеку і завершує програму.
Теорія
TL;DR
throw вираз;примусово викидає виняток і обриває виконання поточного блоку.- Викинути можна будь-яке значення, але правильно кидати
Errorабо його підклас. - Керування переходить у найближчий
catch; без нього виняток лишається неперехопленим. - Код, записаний після
throwу тому самому блоці, ніколи не виконається. throwце основний інструмент валідації вхідних даних у функціях.
Швидкий приклад
try {
throw new Error("Something went wrong during execution");
} catch (err) {
console.log("Caught:", err.message);
}
// Caught: Something went wrong during executionСинтаксис і що саме можна кинути
Синтаксис максимально короткий:
throw expression;Де expression може бути будь-яким значенням JavaScript: об'єктом, числом, рядком, булевим значенням тощо. Але найчастіше викидають екземпляр класу Error.
Найпростіше використання:
throw "Something went wrong";У консолі:
Uncaught Something went wrongТут програма негайно зупиняється, бо виняток не було перехоплено.
Кидати можна і звичайний об'єкт:
try {
throw { message: "Network error", code: 500 };
} catch (e) {
console.log(e.message, e.code);
}
// Network error 500Але так робити не рекомендується: краще завжди використовувати стандартні класи помилок (Error, TypeError, RangeError тощо), щоб зберегти читабельність, сумісність і стек викликів.
throw разом із try / catch / finally
Коли throw спрацьовує всередині try, відбувається таке:
throwстворює виняток, зазвичай об'єктError.- Виконання блоку
tryпереривається на цьому рядку. - Керування передається у
catch. - Помилку оброблено, програма продовжує роботу.
try {
// викидаємо виняток
throw new Error("Failure");
} catch (e) {
// ловимо виняток
console.log("Caught:", e.message);
} finally {
console.log("This block always runs");
}Блок finally виконається в будь-якому разі: і коли виняток був, і коли його не було.
Перевірка вхідних даних через throw
Найчастіший практичний сценарій, це валідація аргументів функції:
function divide(a, b) {
if (typeof a !== "number" || typeof b !== "number") {
throw new TypeError("Both arguments must be numbers");
}
if (b === 0) {
throw new Error("Division by zero is not allowed");
}
return a / b;
}
try {
console.log(divide(5, 0));
} catch (e) {
console.error("Error:", e.message);
}
// Error: Division by zero is not allowedЗверніть увагу на вибір класу: для неправильного типу аргументу природно кидати TypeError, для значення поза допустимим діапазоном RangeError, а для доменної помилки, власний підклас Error.
Після throw код не виконується
throw працює як негайний вихід із блоку:
console.log("before throw");
throw new Error("failure");
console.log("after throw"); // не виконаєтьсяПісля throw виконання поточного блоку припиняється, і керування передається обробнику помилок, якщо він є.
Підсумок
| Пункт | Опис |
|---|---|
| Призначення | Примусово викидає виняток (помилку) |
| Тип значення | Можна викинути будь-який тип даних (зазвичай Error) |
| Ефект | Перериває виконання поточного блоку |
| Використовується з | try...catch для обробки помилок |
| Після throw | Код далі не виконується |
Типові помилки
- Кидати рядок замість
Error.throw "text"позбавляє васstackіname, а інструменти моніторингу такий виняток нормально не покажуть. - Писати код після
throw. Усе, що йде за ним у тому самому блоці, це мертвий код, який ніколи не виконається. - Плутати
throwіreturn.returnвіддає значення виклику,throwрозкручує стек, поки не знайдеcatch. - Кидати виняток усередині асинхронного колбека.
throwу колбекуsetTimeoutне потрапить у зовнішнійtry...catch, бо той блок уже завершився. - Ковтати виняток порожнім
catch. Якщо перехопили, то або обробіть, або киньте далі черезthrow err, інакше причина збою зникне.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.