Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить оператор throw». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**`throw` це оператор, який перериває виконання поточного коду і викидає виняток: помилку або будь-яке інше значення.** Синтаксис простий, `throw вираз;`, і виразом може бути що завгодно: об'єкт, число, рядок, булеве значення. На практиці майже завжди кидають екземпляр `Error` чи його підкласу (`TypeError`, `RangeError`), бо тільки так ви отримаєте `message` і `stack`. Після `throw` решта поточного блоку не виконується: керування одразу переходить у найближчий `catch`, а якщо його немає, виняток спливає по стеку і зупиняє програму. ```javascript function divide(a, b) { if (b === 0) throw new Error("Division by zero is not allowed"); return a / b; } ``` **Ключове:** `throw` примусово породжує виняток і обриває поточний блок, тому кидайте `Error`, а не рядок, і ловіть його в `try...catch`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**`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`, інакше причина збою зникне.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.