Skip to main content

Що таке виняток (exception)

Виняток (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, і може непомітно проковтнути виняток.

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

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

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