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

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

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

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

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

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

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

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

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

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

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

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

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

То есть вот мы делаем здесь поиск подстроки и проверяем если пост не равен минус единички то что-то делаем.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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