Создание и использование пользовательских исключений в JS
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
class CustomError extends Error {
constructor(message) {
super(message);
this.name = "CustomError";
}
}
throw new CustomError("Опознана ошибка!");
try {
// Здесь ошибка может быть сгенерирована...
} catch (error) {
if (error instanceof CustomError) {
// Мы обработали нашу ошибку
} else {
// Обработка прочих ошибок
}
}
Мы создали исключение CustomError
, унаследовав класс Error
. Оно обладает уникальным именем, его можно выбросить и перехватить как стандартную ошибку с помощью instanceof
.
Укрепляем исключения 101
Важность имен при отладке
Во время отладки имя исключения является важной пометкой. Имя
в объекте ошибки облегчает поиск и выявление проблемы.
Трассировка стека: след не должен теряться
Качественное исключение сохраняет трассировку стека, что облегчает поиск источника проблемы. Если вы используете наследование от Error
, браузер автоматически сохранит трассировку стека. Если доступна, используйте Error.captureStackTrace
для решения проблем совместимости.
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError);
}
Настраиваемые свойства: подход с учётом специфики ошибки
Ваши исключения могут включать настраиваемые свойства
помимо имени
и сообщения
. Чтобы контролировать вывод сообщений об ошибках, переопределите метод toString
.
Старый добрый метод: конструкторы и прототипы
До введения классов ES6 мы использовали функциональные конструкторы и прототипное наследование для создания исключений. Следует не недооценивать их.
Персонализация исключений для вашего приложения
Специализированные исключения для определённых задач
Пользовательские исключения позволяют уточнить обработку ошибок. К имени
и сообщению
добавляйте атрибуты, связанные с предметной областью.
this.htmlMessage = `<p>Извините, Дэйв, я не могу это сделать: ${message}</p>`;
this.level = "critical";
Целевая обработка: типизированные исключения
Возможность перехвата определённых типов исключений – ценный аспект языка JavaScript. Если ошибка не того типа, то отправляем её дальше.
Практическое применение пользовательских исключений
- Прекращение выполнения операции при некорректных входных данных
- Бизнес-правила выявляют ошибки в ваших системах
- Интеграция с API сторонних сервисов требует обработки их специфических ошибок
Дополнительные возможности исключений
Модульность в обработке исключений
Оформите ваши пользовательские исключения в виде модулей или классов и экспортируйте их для использования в разных участках приложения.
Иерархия исключений
Структурируйте свои исключения, создавая иерархию типов ошибок, аналогично жизненной реальности.
Визуализация
Представьте работу пользователя, который создаёт уникальный ключ для особого замка.
// Это вы, мастер ключей:
Ключ – ПользовательскийТипИсключения 🛠️🔑
// Ключ подходит к:
Замок – Блок try/catch 🔒🗝️
Уникальный ключ (исключение) предназначен для решения конкретных проблем.
class CustomExceptionType extends Error {
constructor(message) {
super(message);
this.name = "CustomExceptionType";
}
}
try {
throw new CustomExceptionType("В случае опасности бейте стекло!");
} catch (e) {
if (e instanceof CustomExceptionType) {
console.log("Перехватили нашу ошибку. Где стекло? ", e.message);
}
}
Перехват ошибок в асинхронном режиме
Асинхронная обработка ошибок
Применение промисов и async/await
требует понимания асинхронной обработки ошибок. Исключения в асинхронных функциях следует перехватывать, чтобы они не «исчезали».
async function fetchData() {
if (unsuccessfulCondition) {
throw new CustomError("Опознана ошибка!");
}
}
Тестирование с использованием пользовательских исключений
При проведении тестов пользовательские исключения играют важную роль. Утверждения помогают проверять возникновение ожидаемых ошибок.
expect(() => riskyOperation()).toThrow(CustomError);
Сообщения об ошибках, способствующие работе
Хорошо оформленные сообщения об ошибках облегчают отладку. Создавайте сообщения, которые действительно помогают разработчикам.