JS оператор throw


Загальний опис

throw — це ключове слово JavaScript, яке використовується для генерації винятків, що сигналізують про помилки або інші аномалії в роботі програми. Коли throw викликається, виконання коду негайно припиняється, і управління передається найближчому блоку catch або механізму обробки помилок.

У throw можна передати будь-яке значення: об'єкт, рядок, число або навіть функцію. Найчастіше передають об'єкт помилки (Error), який містить інформацію про проблему.

Основна структура:

function divide(a, b) {
    if (b === 0) {
        throw new Error("Ділення на нуль заборонено.");
    }
    return a / b;
}

У цьому прикладі, якщо b дорівнює нулю, програма зупинить виконання і створить виняток із повідомленням.

Як працює разом з try...catch:

try {
    console.log(divide(10, 0));
} catch (error) {
    console.error("Помилка:", error.message);
}

Блок catch обробляє виняток і дозволяє уникнути аварійного завершення програми.

throw також може використовуватися з іншими типами даних, наприклад:

throw "Простий текстовий виняток";
throw 404; // Числовий код помилки
throw {message: "Щось пішло не так", code: 500};

Загалом, throw — потужний інструмент для керування помилками в програмному коді, який дозволяє дотримуватися принципу "fail fast" (швидке виявлення проблем).

автор: Bond

Порада

Обробляйте винятки обережно. Пам’ятайте, що необроблені винятки можуть завершити виконання всієї програми. Завжди використовуйте throw разом із блоками try...catch для захисту критичних ділянок коду.

автор: Bond
Порада

Уникайте використання простих типів (наприклад, рядків або чисел) у throw. Надавайте перевагу об'єктам Error, оскільки вони надають більше інформації, наприклад, стек викликів (stack) та ім’я помилки (name).

автор: Bond
Порада

Створюйте власні класи помилок, успадковані від Error. Це допоможе чіткіше визначити типи помилок:

class ValidationError extends Error {
    constructor(message) {
        super(message);
        this.name = "ValidationError";
    }
}
throw new ValidationError("Некоректні дані!");
автор: Bond

Синтаксис

throw expression;

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
1 1 1 4 12 5
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 18 4 1
Підтримка: серверні переглядачі
Переглядач Node.js Deno
0.10.0 1.0

Приклади

+ запропонувати свій приклад у пісочниці

У цьому прикладі throw використовується для зупинки виконання, якщо дані не відповідають критеріям. Це корисно для підтримання чистоти даних.

function validateUser(user) {
    if (!user.name) throw new Error("Ім'я обов'язкове.");
    if (user.age < 18) throw new Error("Користувач повинен бути старше 18 років.");
    return "Користувач успішно верифікований.";
}

try {
    console.log(validateUser({ name: "Іван", age: 15 }));
} catch (error) {
    console.error("Помилка валідації:", error.message);
}
автор: Bond

Тут створено власний клас помилок NetworkError, який дозволяє розмежувати різні типи винятків і обробляти їх по-різному.

class NetworkError extends Error {
    constructor(message) {
        super(message);
        this.name = "NetworkError";
    }
}

function fetchData(url) {
    if (!url.startsWith("https://")) {
        throw new NetworkError("URL повинен починатися з 'https://'.");
    }
    // Логіка запиту
    return "Дані завантажено.";
}

try {
    console.log(fetchData("http://example.com"));
} catch (error) {
    if (error instanceof NetworkError) {
        console.error("Мережева помилка:", error.message);
    } else {
        console.error("Невідома помилка:", error);
    }
}
автор: Bond

Цей приклад інтерактивний: користувач може вводити значення та перевіряти їхню коректність. Якщо дані некоректні, вони побачать відповідне повідомлення про помилку. Це зручно для навчання роботі з винятками та забезпечення правильної взаємодії з користувачем.

HTML

<header>
  <h2 class="title">Використання "throw" у валідації форми</h2>
  <p class="description">Завершує виконання, якщо введені дані не відповідають умовам.</p>
</header>
<main>
  <div class="result">
    <form id="validationForm">
      <label for="userInput">Введіть число (від 1 до 100):</label><br>
      <input type="text" id="userInput" placeholder="Наприклад: 42"><br><br>
      <button type="submit">Перевірити</button>
    </form>
    <p id="message"></p>
  </div>
</main>

CSS

body {
  font-size: 16px;
  line-height: 1.5;
  font-family: monospace;
}

header {
  background-color: #f1f1f1;
  margin-bottom: 25px;
  padding: 15px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

header h2.title {
  padding-bottom: 15px;
  border-bottom: 1px solid #999;
}

header p.description {
  font-style: italic;
  color: #222;
}

.result {
  background-color: #f8f8f8;
  padding: 15px;
  box-shadow: 0px 0px 3px 0px rgba(118, 118, 118, 1);
}

#message {
  margin-top: 15px;
  font-weight: bold;
}

JS

document.getElementById("validationForm").addEventListener("submit", function (event) {
  event.preventDefault(); // Запобігаємо перезавантаженню сторінки

  const userInput = document.getElementById("userInput").value;
  const messageElement = document.getElementById("message");

  try {
    validateInput(userInput);
    messageElement.style.color = "green";
    messageElement.textContent = "Введені дані коректні!";
  } catch (error) {
    messageElement.style.color = "red";
    messageElement.textContent = error.message;
  }
});

function validateInput(input) {
  const number = Number(input);

  if (isNaN(number)) {
    throw new Error("Ви повинні ввести число!");
  }
  if (number < 1 || number > 100) {
    throw new Error("Число повинно бути в діапазоні від 1 до 100.");
  }
}
//# sourceURL=pen.js
автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід