Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке виняток (exception)». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Виняток (exception) це подія, яка виникає під час виконання програми: сталася помилка, і нормальний хід виконання коду переривається.** Рушій JavaScript «викидає» (`throw`) об'єкт помилки, після чого шукає найближчий блок `try...catch`, який цей виняток «зловить». Важливо не плутати два поняття: `Error` це об'єкт із даними про те, що пішло не так, а exception це сам момент викидання цього об'єкта. Винятки бувають автоматичні, коли їх кидає сам рушій (наприклад `ReferenceError` на неоголошеній змінній), і користувацькі, коли розробник пише `throw new Error(...)`. Якщо виняток не перехопили, він спливає вгору по стеку викликів і завершує виконання з помилкою. ```javascript try { throw new Error("Network error"); } catch (error) { console.log("Caught exception:", error.message); } ``` **Ключове:** Error це дані, exception це подія їх викидання; неперехоплений виняток спливає по стеку і зупиняє програму.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**Виняток (exception) це подія, яка виникає під час виконання програми, коли стається помилка, і нормальне виконання коду переривається.** Інакше кажучи, виняток це «сигнал» про помилкову ситуацію, який рушій JavaScript «викидає» (`throw`) і який можна «зловити» (`catch`). ## Теорія ### TL;DR - Виняток це момент викидання помилки, а `Error` це об'єкт із інформацією про те, що пішло не так. - Виняток перериває нормальний потік виконання і запускає пошук найближчого `try...catch`. - Механізм тримається на чотирьох ключових словах: `try`, `throw`, `catch`, `finally`. - Винятки бувають автоматичні (їх кидає рушій) і користувацькі (їх кидає розробник через `throw`). - Якщо виняток ніхто не перехопив, він спливає по стеку викликів і програма завершується з помилкою. ### Швидкий приклад ```javascript function divide(a, b) { if (b === 0) { throw new Error("Division by zero is not allowed"); } return a / b; } try { divide(5, 0); // here the exception is thrown } catch (err) { console.log("Caught exception:", err.message); } ``` ### Визначення **Виняток (exception)** це **подія**, яка виникає **під час виконання програми**, коли стається помилка, і **нормальне виконання коду переривається**. Іншими словами, **виняток це «сигнал» про помилкову ситуацію**, який рушій JavaScript «викидає» (`throw`) і який можна «зловити» (`catch`). ### Різниця між error та exception - **Error (помилка)** це **об'єкт**, який містить інформацію про те, що пішло не так. - **Exception (виняток)** це **момент**, коли цей об'єкт помилки **був викинутий** у процесі виконання. > Іншими словами: > Error це **дані**, > Exception це **подія викидання цих даних**. ### Як саме виникає виняток Розберемо приклад вище крок за кроком: 1. Виконується функція `divide`. 2. Умова `b === 0` істинна, і рушій **«викидає» (`throw`) об'єкт помилки**. 3. Ця подія і є **винятком**. 4. JavaScript починає шукати найближчий `try...catch`. 5. Блок `catch` **перехоплює** виняток, і програма продовжує роботу. ### Механізм винятків: try / throw / catch / finally | Ключове слово | Що робить | | --- | --- | | `try` | Блок, у якому може статися помилка | | `throw` | Викидає виняток | | `catch` | Перехоплює виняток і обробляє його | | `finally` | Виконується завжди, навіть якщо була помилка | Приклад: ```javascript try { throw new Error("Network error"); } catch (error) { console.log("Caught exception:", error.message); } finally { console.log("This code always runs"); } ``` ### Два види винятків 1. **Автоматичні (їх кидає рушій).** Виникають, коли рушій сам виявляє помилку: ```javascript console.log(a); // ReferenceError, виняток викинуто автоматично ``` 2. **Користувацькі (явні).** Коли програміст сам викидає виняток: ```javascript throw new Error("Something went wrong"); ``` ### Що буде, якщо виняток не спіймати Якщо виняток **не перехоплено** (блок `catch` відсутній), він «спливає» вгору по стеку викликів. Якщо врешті його ніхто не зловив, програма **завершується з помилкою**: ```javascript function a() { b(); } function b() { throw new Error("Failure"); } a(); // помилка завершить виконання ``` У браузері такий виняток потрапляє в консоль і, за потреби, у глобальний обробник `window.onerror`, а в Node.js подія `uncaughtException` за замовчуванням завершує процес. ### Типові помилки - **Плутати `Error` і exception.** Створення об'єкта `new Error("...")` саме по собі нічого не перериває: винятком воно стає лише після `throw`. - **Порожній `catch`.** Блок `catch {}` без обробки ховає проблему: програма йде далі у зламаному стані, а причину ви вже не побачите. - **Очікувати, що `try...catch` зловить асинхронну помилку.** Виняток, кинутий у колбеку `setTimeout` або в необробленому промісі, не потрапить у зовнішній `try...catch`; для промісів потрібні `await` усередині `try` або `.catch()`. - **Кидати не об'єкт помилки.** `throw "text"` технічно дозволено, але тоді у вас немає ані `message`, ані `stack`; завжди кидайте `new Error(...)` або його підклас. - **Забувати, що `finally` виконається навіть після `return`.** `return` усередині `finally` перезапише значення, повернуте з `try`, і може непомітно проковтнути виняток.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.