Що таке виняток (exception)
Виняток (exception) це подія, яка виникає під час виконання програми, коли стається помилка, і нормальне виконання коду переривається. Інакше кажучи, виняток це «сигнал» про помилкову ситуацію, який рушій JavaScript «викидає» (throw) і який можна «зловити» (catch).
Теорія
TL;DR
- Виняток це момент викидання помилки, а
Errorце об'єкт із інформацією про те, що пішло не так. - Виняток перериває нормальний потік виконання і запускає пошук найближчого
try...catch. - Механізм тримається на чотирьох ключових словах:
try,throw,catch,finally. - Винятки бувають автоматичні (їх кидає рушій) і користувацькі (їх кидає розробник через
throw). - Якщо виняток ніхто не перехопив, він спливає по стеку викликів і програма завершується з помилкою.
Швидкий приклад
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 це подія викидання цих даних.
Як саме виникає виняток
Розберемо приклад вище крок за кроком:
- Виконується функція
divide. - Умова
b === 0істинна, і рушій «викидає» (throw) об'єкт помилки. - Ця подія і є винятком.
- JavaScript починає шукати найближчий
try...catch. - Блок
catchперехоплює виняток, і програма продовжує роботу.
Механізм винятків: try / throw / catch / finally
| Ключове слово | Що робить |
|---|---|
try | Блок, у якому може статися помилка |
throw | Викидає виняток |
catch | Перехоплює виняток і обробляє його |
finally | Виконується завжди, навіть якщо була помилка |
Приклад:
try {
throw new Error("Network error");
} catch (error) {
console.log("Caught exception:", error.message);
} finally {
console.log("This code always runs");
}Два види винятків
-
Автоматичні (їх кидає рушій). Виникають, коли рушій сам виявляє помилку:
javascriptconsole.log(a); // ReferenceError, виняток викинуто автоматично -
Користувацькі (явні). Коли програміст сам викидає виняток:
javascriptthrow new Error("Something went wrong");
Що буде, якщо виняток не спіймати
Якщо виняток не перехоплено (блок catch відсутній), він «спливає» вгору по стеку викликів. Якщо врешті його ніхто не зловив, програма завершується з помилкою:
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, і може непомітно проковтнути виняток.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.