Skip to main content

Що робить оператор throw

throw це оператор, який перериває виконання поточного коду і викидає виняток: помилку або будь-який інший об'єкт. Він перетворює звичайне значення на подію помилки, яку далі ловить try...catch, а якщо ловити нікому, виняток спливає по стеку і завершує програму.

Теорія

TL;DR

  • throw вираз; примусово викидає виняток і обриває виконання поточного блоку.
  • Викинути можна будь-яке значення, але правильно кидати Error або його підклас.
  • Керування переходить у найближчий catch; без нього виняток лишається неперехопленим.
  • Код, записаний після throw у тому самому блоці, ніколи не виконається.
  • throw це основний інструмент валідації вхідних даних у функціях.

Швидкий приклад

javascript
try { throw new Error("Something went wrong during execution"); } catch (err) { console.log("Caught:", err.message); } // Caught: Something went wrong during execution

Синтаксис і що саме можна кинути

Синтаксис максимально короткий:

javascript
throw expression;

Де expression може бути будь-яким значенням JavaScript: об'єктом, числом, рядком, булевим значенням тощо. Але найчастіше викидають екземпляр класу Error.

Найпростіше використання:

javascript
throw "Something went wrong";

У консолі:

text
Uncaught Something went wrong

Тут програма негайно зупиняється, бо виняток не було перехоплено.

Кидати можна і звичайний об'єкт:

javascript
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, відбувається таке:

  1. throw створює виняток, зазвичай об'єкт Error.
  2. Виконання блоку try переривається на цьому рядку.
  3. Керування передається у catch.
  4. Помилку оброблено, програма продовжує роботу.
javascript
try { // викидаємо виняток throw new Error("Failure"); } catch (e) { // ловимо виняток console.log("Caught:", e.message); } finally { console.log("This block always runs"); }

Блок finally виконається в будь-якому разі: і коли виняток був, і коли його не було.

Перевірка вхідних даних через throw

Найчастіший практичний сценарій, це валідація аргументів функції:

javascript
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 працює як негайний вихід із блоку:

javascript
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, інакше причина збою зникне.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.