Кратко
Помимо встроенных ошибок (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)
Ментальная модель
Пользовательские ошибки — как маркированные пакеты. Вместо одного ящика «ошибки» — отдельные ящики «ошибка валидации», «ошибка сети», «ошибка авторизации». Каждый обрабатывается по-своему.
Примеры
**Самый простой:**
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 ловит её.
**Простой:**
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).
**Реальный пример:**
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) — модули: организация кода по файлам.