Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Исключения JS: Погружаясь в классы

Исключения – один из немногих примеров удачного использования наследования. В этом уроке мы научимся создавать свои исключения и перехватывать их.

Обычно исключения используются так. Ближе к началу программы стоит конструкция try/catch, которая ловит исключения и показывает пользователю адекватное сообщение:

try {
  doSomethingDangerous();
} catch (e) {
  console.log(e);
}

Но как понять что случилось? Иногда это важно. Разные ошибки могут приводить к разному поведению программы. Кроме того, не все ошибки требуют обработки в текущем месте программы.

Разделять ошибки можно с помощью разных классов наследующихся от класса Error.

// Такой способ работает только если не используется Babel
class MyError extends Error {}
class AnotherError extends MyError {}

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

Теперь посмотрим как этим можно воспользоваться:

try {
  // Какой-то код, который может выбросить исключение
} catch (e) {
  if (e instanceof MyError)
    // Делаем что-нибудь одно
  else if (e instanceof SomeError) {
    // Делаем что-нибудь другое
  }

  // Во всех остальных случаях, например, бросаем исключение снова
  throw e;
}

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

Практически в любом языке программирования есть негласное правило о том, как работать с иерархиями исключений. Любая программа, должна определять своё собственное высокоуровневое исключение, которое наследуется от Error. Все остальные исключения библиотеки наследуются от него. Такой подход позволяет изолировать обработку ошибок конкретной библиотеки буквально одним блоком catch.

Но не все библиотеки в JavaScript используют наследование. Дело в том, что до стандарта es6 не было классов и простого способа создания "наследников" от конструктора Error. И, так как многие библиотеки всё ещё реализуются на старом стандарте, они решают проблему определения типа ошибки с помощью обычного свойства:

import axios from 'axios';

try {
  client.get('https://ru.hexlet.io');
} catch (e) {
  if (e.isAxiosError) {
    // Сюда попадут все ошибки библиотеки axios
  }

  // обработка остальных ошибок
}

Блок finally

В некоторых ситуациях бывает нужно продолжить работу независимо от того, возникло исключение или нет. Используя только try/catch, эту задачу нельзя выполнить без дублирования. Придётся размещать код как после всей конструкции try/catch, так и в каждом блоке catch.

Это привело к тому, что саму конструкцию расширили, добавив в неё блок finally. Этот блок вызывается в самом конце и в любом случае:

try {
  // Какой-то код
} catch (e) {
  // Делаем что-нибудь одно
} finally {
  // Вызовется в любом случае
}

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
1 декабря 8 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
1 декабря 8 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»