JS Core

Пользовательские ошибки

Научиться создавать собственные ошибки с помощью throw new Error и пользовательских классов ошибок для более точной обработки.

Начальный (Beginner)

Кратко

Помимо встроенных ошибок (TypeError, ReferenceError), вы можете создавать собственные ошибки: throw new Error('описание'). Для сложных случаев — пользовательские классы ошибок: class ValidationError extends Error.


Подробно

Обратите внимание: для пользовательских ошибок ниже используется синтаксис class и extends — он детально разбирается в разделе JS Intermediate (классы, JI8). Пока воспринимайте этот код как образец, главное здесь — идея своих типов ошибок.

Создание ошибки: throw new Error('Что-то пошло не так'); throw new TypeError('Ожидается число'); throw new RangeError('Число должно быть от 1 до 10');

Пользовательские ошибки: class ValidationError extends Error { constructor(message, field) { super(message); this.name = 'ValidationError'; this.field = field; } }

Использование: function validateAge(age) { if (age < 0) { throw new ValidationError('Возраст не может быть отрицательным', 'age'); } }

Обработка разных ошибок: try { validateAge(-5); } catch (error) { if (error instanceof ValidationError) { console.error(Ошибка в поле ${error.field}: ${error.message}); } else { console.error('Неожиданная ошибка:', error); } }

Зачем собственные ошибки:

  • Разные типы ошибок → разная обработка
  • Дополнительная информация (field, code)
  • Читаемый код (ValidationError вместо Error)

Ментальная модель

Пользовательские ошибки — как маркированные пакеты. Вместо одного ящика «ошибки» — отдельные ящики «ошибка валидации», «ошибка сети», «ошибка авторизации». Каждый обрабатывается по-своему.


Примеры

**Самый простой:**

javascript
function divide(a, b) {
  if (b === 0) {
    throw new Error('Деление на ноль невозможно');
  }
  return a / b;
}

try {
  divide(10, 0);
} catch (error) {
  console.error(error.message); // 'Деление на ноль невозможно'
}

throw создаёт ошибку с описанием. catch ловит её.

**Простой:**

javascript
class NotFoundError extends Error {
  constructor(resource, id) {
    super(`${resource} with id ${id} not found`);
    this.name = 'NotFoundError';
    this.resource = resource;
    this.id = id;
  }
}

function findUser(id) {
  const users = { 1: 'Анна' };
  if (!users[id]) throw new NotFoundError('User', id);
  return users[id];
}

Пользовательская ошибка с дополнительной информацией: resource и id. Синтаксис класса здесь — пример будущей темы (классы, JS Intermediate).

**Реальный пример:**

javascript
class AppError extends Error {
  constructor(message, code, statusCode) {
    super(message);
    this.name = 'AppError';
    this.code = code;
    this.statusCode = statusCode;
  }
}

class ValidationError extends AppError {
  constructor(field, message) {
    super(message, 'VALIDATION_ERROR', 400);
    this.name = 'ValidationError';
    this.field = field;
  }
}

class NotFoundError extends AppError {
  constructor(resource) {
    super(`${resource} not found`, 'NOT_FOUND', 404);
    this.name = 'NotFoundError';
  }
}

Иерархия ошибок: базовый AppError → ValidationError, NotFoundError. Каждая с своим кодом и HTTP-статусом. Это пример будущей темы: наследование классов (class ... extends) полностью разбирается в JS Intermediate (JI8–JI9).


Частые ошибки

**Неправильно:** Бросать строки вместо объектов Error

**Почему:** throw 'ошибка' — работает, но не содержит стек-трейс и не instanceof Error.

**Правильно:** Всегда: throw new Error('описание').

**Неправильно:** Создавать слишком много типов ошибок

**Почему:** Если обработка одинаковая — достаточно одного типа. Не усложняйте.

**Правильно:** Создавайте собственные ошибки только когда нужна разная обработка.

**Неправильно:** Забывать extends Error

**Почему:** Без extends Error ваш класс не будет распознан как ошибка.

**Правильно:** Ваш класс ошибки должен расширять Error для правильного наследования.


Важно запомнить

  • throw new Error('message') — создание ошибки
  • extends Error — пользовательская ошибка
  • instanceof — проверка типа ошибки
  • Разные ошибки → разная обработка
  • Всегда бросайте объекты Error, не строки

Связь

Назад: Вы знаете try/catch (J23) — теперь вы умеете создавать осмысленные ошибки.

Вперёд: Следующий урок (J25) — модули: организация кода по файлам.

Материалы курса JS Core — PROlab Academy.