Наповнення JS розділу

Добридень, Пані та Панове, завдяки вам вдалося зібрати більше 19тис грн з необхідних 15тис на впровадження JS розділу.

JS розділ вже впроваджено - переходимо до його наповнення і почнемо бігти довгий марафон, адже JS має більше 1100 різноманітних методів, властивостей, подій і т.д., які необхідно описати.

Будемо працювати, і вдень, і вночі, щоб орієнтовно взимку закінчити наповнювати JS розділ!

Ви також можете допомогти нам в цьому. Долучайтеся до нашої спільноти в дискорді - ставайте її частиною і допомагайте нашому розвитку.

Також, підтримуйте нас матеріально.

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) {
  // тут обробляємо помилку
}

І ось як це працює:

  1. Спершу виконується код в середині блоку try {...}.
  2. Якщо код працює без помилок, блок catch(err) пропускається, і програма продовжує роботу далі, не заходячи в catch.
  3. Якщо ж у коді допущено помилку, виконання 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 — це спеціалізований підклас для помилок, пов'язаних із таймаутом.
  • В кінці демонструється, як можна використовувати ці класи при обробці виняткових ситуацій.
Порада:

Використовуйте блоки try..catch для того, щоб "перехопити" помилки в різних частинах вашого коду. Це дозволяє вам відмовитися від "упадку" програми і вибрати альтернативний шлях виконання.

Порада:

Переконайтеся, що ви адекватно обробляєте помилки, якщо вони виникають. Просто виведення помилки в консоль не завжди є кращим рішенням; в залежності від ситуації, може бути потрібна корекція даних, зворотний зв'язок користувачеві або повторна спроба виконання операції.

Нотатка:

Об'єкт Error має кілька корисних властивостей, таких як message і name, які можуть допомогти вам зрозуміти природу помилки. Також іноді корисно використовувати Error.stack для отримання стеку викликів, який призвів до помилки.

Синтаксис

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"
}

Методи

Властивості

message
Дозволяє отримати рядкове повідомлення, що описує деталі помилки.
name
Вказує на ім'я помилки або конкретний тип помилки.