logo

Создание и использование пользовательских исключений в JS

Быстрый ответ

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 для решения проблем совместимости.

JS
Скопировать код
if (Error.captureStackTrace) {
    Error.captureStackTrace(this, CustomError);
}

Настраиваемые свойства: подход с учётом специфики ошибки

Ваши исключения могут включать настраиваемые свойства помимо имени и сообщения. Чтобы контролировать вывод сообщений об ошибках, переопределите метод toString.

Старый добрый метод: конструкторы и прототипы

До введения классов ES6 мы использовали функциональные конструкторы и прототипное наследование для создания исключений. Следует не недооценивать их.

Персонализация исключений для вашего приложения

Специализированные исключения для определённых задач

Пользовательские исключения позволяют уточнить обработку ошибок. К имени и сообщению добавляйте атрибуты, связанные с предметной областью.

JS
Скопировать код
this.htmlMessage = `<p>Извините, Дэйв, я не могу это сделать: ${message}</p>`;
this.level = "critical";

Целевая обработка: типизированные исключения

Возможность перехвата определённых типов исключений – ценный аспект языка JavaScript. Если ошибка не того типа, то отправляем её дальше.

Практическое применение пользовательских исключений

  • Прекращение выполнения операции при некорректных входных данных
  • Бизнес-правила выявляют ошибки в ваших системах
  • Интеграция с API сторонних сервисов требует обработки их специфических ошибок

Дополнительные возможности исключений

Модульность в обработке исключений

Оформите ваши пользовательские исключения в виде модулей или классов и экспортируйте их для использования в разных участках приложения.

Иерархия исключений

Структурируйте свои исключения, создавая иерархию типов ошибок, аналогично жизненной реальности.

Визуализация

Представьте работу пользователя, который создаёт уникальный ключ для особого замка.

Markdown
Скопировать код
// Это вы, мастер ключей:

Ключ  –  ПользовательскийТипИсключения 🛠️🔑

// Ключ подходит к:

Замок  –  Блок try/catch 🔒🗝️

Уникальный ключ (исключение) предназначен для решения конкретных проблем.

JS
Скопировать код
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 требует понимания асинхронной обработки ошибок. Исключения в асинхронных функциях следует перехватывать, чтобы они не «исчезали».

JS
Скопировать код
async function fetchData() {
    if (unsuccessfulCondition) {
        throw new CustomError("Опознана ошибка!");
    }
}

Тестирование с использованием пользовательских исключений

При проведении тестов пользовательские исключения играют важную роль. Утверждения помогают проверять возникновение ожидаемых ошибок.

JS
Скопировать код
expect(() => riskyOperation()).toThrow(CustomError);

Сообщения об ошибках, способствующие работе

Хорошо оформленные сообщения об ошибках облегчают отладку. Создавайте сообщения, которые действительно помогают разработчикам.