JS об'єкт Error
Об'єкт Error
Об'єкт Error
у JavaScript використовується для представлення помилок, які можуть виникнути під час виконання програми. Це базовий об'єкт для представлення помилок, від якого можуть успадковуватися інші типи помилок.
Навіщо він потрібен?
- Семантична зрозумілість: Використання об'єктів помилок робить код більш зрозумілим, оскільки вказує на конкретні місця, де можливі проблеми.
- Обробка помилок: За допомогою механізму
try..catch
можна вловлювати помилки, щоб програма продовжувала роботу незважаючи на непередбачувані обставини.
Приклад створення та кидання помилки:
function divide(a, b) {
if(b === 0) {
throw new Error("Ділення на нуль неможливе");
}
return a / b;
}
try {
let result = divide(4, 0);
} catch(error) {
console.log("Помилка: " + error.message);
}
У цьому прикладі, коли ми намагаємося поділити число на нуль, генерується помилка за допомогою throw
. Далі ця помилка ловиться в блоку try...catch
, і ми можемо обробити її виведенням повідомлення про помилку.
Обробка помилок - це ключовий аспект написання надійних програм. Завдяки об'єкту Error
та його похідним типам, JavaScript надає гнучкі інструменти для діагностики та обробки різноманітних проблем, які можуть виникнути під час виконання коду.
Типи помилок
Окрім загального конструктора Error
, в JavaScript існують інші основні конструктори помилок. Для обробки винятків на стороні клієнта дивіться розділ про обробку виняткових ситуацій.
EvalError
- Створює екземпляр, що представляє помилку, яка виникає стосовно глобальної функції eval()
.
RangeError
- Створює екземпляр, що відображає помилку, яка виникає, коли числова змінна або параметр виходять за межі свого діапазону.
ReferenceError
- Створює екземпляр, що представляє помилку, яка виникає при спробі звернення до недійсного посилання.
SyntaxError
- Створює екземпляр, що відображає синтаксичну помилку.
TypeError
- Створює екземпляр, що представляє помилку, яка виникає, коли змінна або параметр не відповідають відповідному типу.
URIError
- Створює екземпляр, що представляє помилку, яка виникає, коли функції encodeURI()
або decodeURI()
передаються недійсні параметри.
AggregateError
- Створює екземпляр, що представляє кілька помилок, об'єднаних в одну, коли потрібно повідомити про декілька помилок від однієї операції, наприклад, використовуючи Promise.any()
.
InternalError
(нестандартний) - Створює екземпляр, що відображає помилку, яка виникає, коли кидається внутрішня помилка у рушії JavaScript. Наприклад, "занадто багато рекурсії".
Обробка помилок
Безліч факторів може призвести до помилок у наших програмах: людський фактор, несподіваний ввід користувача, хибні дії сервера тощо. Зазвичай, якщо скрипт зіткнувся з помилкою, він негайно зупиняється, відображаючи повідомлення про помилку в консолі. Однак, JavaScript надає можливість користувачам "спіймати" помилки за допомогою конструкції try..catch
, замість того щоб скрипт "завмирав", ця конструкція допомагає нам реагувати на помилки більш конструктивно.
Структура try…catch
try..catch
поділяється на дві частини: try
та catch
:
try {
// тут код...
} catch (err) {
// тут обробляємо помилку
}
І ось як це працює:
- Спершу виконується код в середині блоку
try {...}
. - Якщо код працює без помилок, блок
catch(err)
пропускається, і програма продовжує роботу далі, не заходячи вcatch
. - Якщо ж у коді допущено помилку, виконання
try
припиняється, і керування переходить доcatch(err)
. Зміннаerr
(можна використовувати різні назви) містить деталі про помилку.
Отже, завдяки try..catch
ми отримуємо можливість відповідно реагувати на різні помилки, не зупиняючи роботу всього скрипта.
Користувацькі помилки
Під час розробки програмного забезпечення ми часто стикаємося із потребою власних класів помилок для різноманітних ситуацій. Наприклад, при взаємодії з мережею може знадобитися клас HttpError
, для роботи з базою даних — DbError
, а для пошукових операцій — NotFoundError
.
Ці спеціалізовані класи помилок мають підтримувати базові властивості, такі як message
, name
та, опціонально, stack
. Але вони також можуть мати свої унікальні атрибути. До прикладу, об'єкти HttpError
можуть включати властивість statusCode
із значеннями 404, 403 або 500.
Мова JavaScript дозволяє використовувати оператор throw
з будь-якими аргументами, отже, технічно, наші класи помилок можуть не успадковувати від Error
. Однак, якщо використовувати наслідування, то з'являється можливість ідентифікації об'єктів помилок через оператор instanceof Error
. Тому наслідування в цьому контексті є бажаним.
З ростом вашого додатку, ваші власні класи помилок можуть формувати ієрархію. Наприклад, HttpTimeoutError
може бути підкласом HttpError
, і так далі.
Короткий приклад, який демонструє створення власного класу помилки в JavaScript:
// Базовий клас помилки
class CustomError extends Error {
constructor(message) {
super(message);
this.name = this.constructor.name; // Отримання назви поточного класу
}
}
// Клас помилки для HTTP
class HttpError extends CustomError {
constructor(statusCode, message) {
super(message);
this.statusCode = statusCode;
}
}
// Клас помилки для таймауту HTTP-запиту
class HttpTimeoutError extends HttpError {
constructor() {
super(408, 'Запит перевищив встановлений час очікування');
}
}
// Демонстрація використання
try {
throw new HttpTimeoutError();
} catch (e) {
if (e instanceof HttpError) {
console.error(`HTTP помилка з кодом: ${e.statusCode}, Повідомлення: ${e.message}`);
} else {
console.error(`Сталася помилка: ${e.message}`);
}
}
У цьому прикладі:
- Створено базовий клас
CustomError
, який успадковує стандартний класError
. - Клас
HttpError
додає додаткову властивістьstatusCode
для коду статусу. - Клас
HttpTimeoutError
— це спеціалізований підклас для помилок, пов'язаних із таймаутом. - В кінці демонструється, як можна використовувати ці класи при обробці виняткових ситуацій.
Порада: | Використовуйте блоки |
Порада: | Переконайтеся, що ви адекватно обробляєте помилки, якщо вони виникають. Просто виведення помилки в консоль не завжди є кращим рішенням; в залежності від ситуації, може бути потрібна корекція даних, зворотний зв'язок користувачеві або повторна спроба виконання операції. |
Нотатка: | Об'єкт |
Синтаксис
new Error();
Переглядачі
Переглядач | |||||
---|---|---|---|---|---|
1 |
1 |
4 |
1 |
12 |
Переглядач | ||||
---|---|---|---|---|
4.4 |
18 |
4 |
1 |
Переглядач | ||
---|---|---|
0.10.0 |
1.0 |
Приклади
У даному прикладі ми демонструємо, як можна "кинути" помилку в коді JavaScript і потім "перехопити" її для обробки. Зокрема:
- В блоці
try
ми "кидаємо" нову помилку за допомогою ключового словаthrow
із текстом "Ой!". - Якщо помилка виникає всередині
try
, виконання переходить в блокcatch
. - В блоці
catch
ми "ловимо" помилку і виводимо інформацію про неї (назву та повідомлення) в консоль.
try {
throw new Error("Ой!"); // Викидаємо нову помилку
} catch (e) {
console.error(`${e.name}: ${e.message}`); // Ловимо та виводимо інформацію про помилку в консоль
}
У даному прикладі показано, як в JavaScript можна використовувати конструкцію try..catch..finally
. Ця конструкція допомагає обробляти помилки і виконувати код, незалежно від того, чи виникли помилки чи ні.
- Код у блоці
try
спробує виконатися першим. - Якщо у блоці
try
виникає помилка, виконання переходить в блокcatch
, де помилку можна обробити. - Блок
finally
виконується завжди, незалежно від того, чи були помилки чи ні.
Тут є інтерактивний елемент: користувача запитують, чи треба генерувати помилку. Відповідь користувача визначає, який "шлях" виконання буде обраний:
- Якщо "так", то виконується
try -> catch -> finally
. - Якщо "ні", то виконується
try -> finally
.
try {
alert('try'); // Повідомлення "try"
if (confirm('Згенерувати помилку?')) BAD_CODE(); // Запитуємо користувача, чи треба генерувати помилку
} catch (e) {
alert('catch'); // Повідомлення "catch"
} finally {
alert('finally'); // Повідомлення "finally"
}