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

Обработка ошибок JS: Обработка ошибок

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

Что не считается ошибкой

Допустим, у нас есть следующая строчка:

'Blue Whale'.indexOf('Blue'); // 0

Мы хотим узнать индекс элемента — позицию, с которой начинается подстрока. Для этого в JavaScript есть функция indexOf, которая есть во многих языках. Она везде ведет себя одинаково.

Если мы находим вхождение подстроки, то функция возвращает нам ее индекс.

Первый индекс равен нулю — это является валидным результатом. При этом во многих языках нуль — это false, поэтому надо быть аккуратным с проверкой при вызове этой функции.

Случается так, что это подстрока не нашлась. При этом такая ситуация не будет считаться ошибкой. indexOf проверил строчку, увидел, что ее там нет, и должен об этом рапортовать.

В таких случаях в обычных языках чаще всего возвращается -1:

'Blue Whale'.indexOf('Blute'); // -1

Это число ничего не значит. Но если эта подстрока существует в строке, то число будет всегда положительным. Отрицательное число говорит о том, что подстроки нет.

В более продвинутых языках есть специальные механизмы, которые называются монады. Они умеют возвращать специальное значение nothing, которое означает, что ничего не было найдено. Такой способ является более предпочтительным. Но в языках, в которых монады не используются, применяют indexOf.

Посмотрим работу проверки:

// Делаем поиск подстроки
const pos = 'Blue Whale'.indexOf('Whale');

// Проверяем, равен ли pos -1
if (pos !== -1) {
    // ...
}

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

Что считается ошибкой

Перечислим ситуации, которые будут считаться ошибками в случае удаления директории:

  • Директория не существует
  • Передан файл — потому что ожидалась директория, а функция ее удаляет
  • Директория не пустая — тогда ее нельзя будет удалить, так как по умолчанию удаление невозможно, если она не пустая
  • Передана не строка — например, вместо path можно передать число

Ошибочной ситуация является та, при которой функция не способна выполнить то, что она обещает.

Когда мы проверяли в строке подстроку, функция выполняла свою задачу. Она проверяет и просто не находит. Но она выполняет свою задачу. А когда функция не может удалить директорию, потому что она не пустая, функция не способна выполнить свою задачу, которую поставили перед ней. Данная ситуация является ошибкой.

Какие типы ошибок бывают

Рассмотрим типы ошибок:

  • Эксплутационные ошибки — ошибки времени выполнения, которые возникают в корректных программах. Например, связанные с взаимодействием с внешней средой — ошибка соединения, или связанные с операционной системой — закончилась память
  • Ошибки программирования — баги в программе, которые нужно обязательно исправлять. Они делятся на множество разных типов. Например, ошибки типизации — когда пытаемся обратиться к функции как к массиву или к любому типу, который автоматически не приводится к нужному типу. Или логические ошибки — например, деление на нуль. Иногда это некорректное поведение программы

Обработка ошибок

В реальной жизни значительная часть кода будет заниматься обработкой ошибок. Например, в сетевых службах обработка ошибок — это большая часть кода. Их обычно сложно предусмотреть заранее — знать участки, где придется делать обработку. Мы можем понимать, где это будет нужно, но полностью представлять возможные кейсы и поведение достаточно сложно.

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

Например, если речь идет про сетевые ошибки, можно попытаться сделать ретрай — выполнить задачу несколько раз. Но в этом случае нужно точно понимать, что всё делается правильно. Без понимания такие вещи делать нельзя.

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

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

Посмотрим на один из методов, который мы писали, statSync():

statSync(path) {
  const parts = getPathParts(path);
  const current = this.tree.getDeepChild(parts);
  if (!current) {
    return false;
  }
  return current.getMeta().getStats();
}

На самом деле в этом примере была ошибка. Мы получали current, который в некоторых случаях может быть undefined, так как если нет ноды, дерево всегда возвращает это значение. Это было специально задуманное поведение.

Если не будет проверки, которая вернула false, то в итоге мы бы упали с ошибкой, так как метод getMeta() пытается вызваться из undefined, и это баг. Такое было во многих функциях, которые мы писали в модуле для работы с файловой системой.

В этом случае нужно проверить, что current нет. В итоге снаружи мы либо получаем false, либо статистику. Поэтому можно строить проверки и на основе них действовать и разрабатывать софт.

Выводы

В этом уроке мы разобрали, что считается ошибкой, а что нет. Например, если функция ничего не находит, но при этом выполняет свою задачу, то это не будет считаться ошибкой. А когда функция не способна выполнить свою задачу, которую поставили перед ней, то здесь мы столкнемся с ошибкой.

Также мы рассмотрели типы ошибок: эксплутационные и ошибки программирования. Мы узнали, что значительная часть кода будет заниматься обработкой ошибок, что их обычно сложно предусмотреть заранее, а избежать ошибки поможет сильная система типов и написание тестов.


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

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

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

Об обучении на Хекслете

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

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

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

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

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

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

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

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

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

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

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»