Прежде чем изучать, как обрабатывать ошибки, нужно определиться, какое поведение считается ошибкой. Также нужно понять, какие типы ошибок встречаются. В этом уроке мы разберем эти темы.
Допустим, у нас есть следующая строчка:
Мы хотим узнать индекс элемента — позицию, с которой начинается подстрока. Для этого в JavaScript есть функция indexOf
, которая есть во многих языках. Она везде ведет себя одинаково.
Если мы находим вхождение подстроки, то функция возвращает нам ее индекс.
Первый индекс равен нулю, поэтому нам возвращается он. Это является валидным результатом. При этом во многих языках нуль — это false
, поэтому надо быть аккуратным с проверкой при вызове этой функции.
Случается так, что это подстрока не нашлась. При этом такая ситуация не будет считаться ошибкой. indexOf
проверил строчку, увидел, что ее там нет, и должен об этом рапортовать.
В таких случаях в обычных языках чаще всего возвращается -1
:
Это число ничего не значит. Но если эта подстрока существует в строке, то число будет всегда положительным. Отрицательное число говорит о том, что подстроки нет.
В более продвинутых языках есть специальные механизмы, которые называются монады. Они умеют возвращать специальное значение nothing
, которое означает, что ничего не было найдено. Такой способ является более предпочтительным. Но в языках, в которых монады не используются, применяют indexOf
.
Посмотрим на проверку на работу:
То есть вот мы делаем здесь поиск подстроки и проверяем если пост не равен минус единички то что-то делаем.
При этом такой случай тоже не является ошибкой. Но когда мы говорим об удалении директории, то нас ожидает большое количество ошибок, которые могут произойти внутри.
Перечислим ситуации, которые будут считаться ошибками в случае удаления директории:
Ошибочной ситуация является та, при которой функция не способна выполнить то, что она обещает.
Когда мы проверяли в строке подстроку, функция выполняла свою задачу. Она проверяет и просто не находит. Но она выполняет свою задачу. А когда функция не может удалить директорию, потому что она не пустая, функция не способна выполнить свою задачу, которую поставили перед ней. Данная ситуация является ошибкой.
Рассмотрим типы ошибок:
В реальной жизни значительная часть кода будет заниматься обработкой ошибок. Например, в сетевых службах обработка ошибок — это большая часть кода. Их обычно сложно предусмотреть заранее — знать участки, где придется делать обработку. Мы можем понимать, где это будет нужно, но полностью представлять возможные кейсы и поведение достаточно сложно.
Чаще всего обрабатываются очевидные ошибки, а остальное — в процессе тестирования и эксплуатации. Только в этом случае становится понятно, как себя вести в данной ситуации.
Например, если речь идет про сетевые ошибки, можно попытаться сделать ретрай — выполнить задачу несколько раз. Но в этом случае нужно точно понимать, что всё делается правильно. Без понимания такие вещи делать нельзя.
Сильная система типов может помочь избежать ошибки. Например, система типов Хаскеля позволяет строить программы так, что они надежны относительно других языков с более слабыми системами типа.
Также обязательно написание тестов. Предусмотреть всё — сложно. При любом изменении без тестов в продакшене будут возникать ситуации, которые приводят к падению программы.
Посмотрим на один из методов, который мы писали, statSync
:
На самом деле в этом примере была ошибка. Мы получали current
, который в некоторых случаях может быть undefined
, так как если нет ноды, дерево всегда возвращает это значение. Это было специально задуманное поведение.
Если не будет проверки, которая вернула false
, то в итоге мы бы упали с ошибкой, так как функция getMeta
пытается вызваться из undefined
, и это баг. Такое было во многих функциях, которые мы писали в модуле для работы с файловой системой.
В этом случае нужно проверить, что current
нет. В итоге снаружи мы либо получаем false
, либо статистику. Поэтому можно строить проверки и на основе них действовать и разрабатывать софт.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт