Отказ от ответственности

Это статья, рассказывающая историю с несколькими примерами кода. Моя цель - объяснить различные концепции в простой форме, чтобы люди ПОНЯЛИ, зачем они нужны, почему эти концепции важны.

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

Сосредоточьтесь на понимании идей и концепций, а не на конкретном языке - так вы получите понимание

Жизненная история

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

Вы можете предположить, что я тоже был весьма самоуверен. И вы будете правы, каждая экспертная оценка была для меня борьбой. Я был абсолютно уверен, что умею все делать правильно.

Ситуация

Однажды я работал над этим клиентом API для комментариев пользователей. Предполагалось, что он будет иметь доступ к классической конечной точке REST API. Клиент должен быть очень простым и поддерживать только несколько типов запросов для создания и чтения комментариев - POST & GET.

В то время я мало что знал о хороших методах обработки ошибок. Хотя я знал об исключениях, но никогда не использовал их - они казались мне лишними.

Я был абсолютно убежден, что все, что мне нужно, - это утверждение « if”!

Поэтому с уверенностью я начал проектировать и внедрять свое решение. Как вы понимаете, я попытался решить все потенциальные проблемы с помощью вариаций IF операторов. Я проверял возвращаемые коды состояния из API и сопоставлял их с нечетными возвратами из моих функций / методов.

Я даже не подумал, если что-то пойдет не так. Например, что, если API не работает, или истек срок действия токена подключения, или изменилась структура данных и т. Д.

Обучение

Как и всякая уважающая себя компания, мы были «гибкими» и делали «TDD». Ну, мы думали, что были. После того, как я закончил реализацию своего кода, я изо всех сил пытался его протестировать. У меня было так много IF операторов и разных состояний, которые возвращали мои функции, что было действительно сложно писать для них тесты. 🔥

Если вы изо всех сил пытаетесь протестировать свой код из-за его сложности, это сигнал о запахе кода.

PR или время экспертной оценки.

В восторге от того, как людям понравится мое решение, я отправил свой запрос на слияние. И началось. Очень быстро люди засыпали меня комментариями.

- »Что будет, если это? Что будет, если это? »

- «Как мы можем узнать вне клиента API, если что-то пошло не так?»

- ”Что произойдет, когда нам потребуется расширить этот клиент API дополнительными методами и типами запросов? Придется ли нам дублировать ваши операторы IF повсюду? »

- «Вам следует серьезно изучить методы обработки ошибок и, в частности, исключения!»

Не буду врать, это было тяжело. Но это был поворотный момент в моей карьере инженера-программиста. Я понял - «Я не являюсь исключением из правил, и я должен узнать об исключениях!».

Зачем беспокоиться?

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

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

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

Обработка ошибок - что это значит

В каждом приложении будут ошибки. Даже если вы создали отличное приложение с чистой и надежной реализацией. Если вы исправили все ошибки в мире, у вас все равно будут ошибки в вашем приложении.

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

Ошибка - это не ошибка

Очень важно различать эти две вещи. Ошибка - это неожиданное поведение или аномалия, которую вы не могли предсказать. Часто это просто что-то, что вы упустили в своем коде.

Ошибка - это непредсказуемая аномалия в вашем коде

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

Ошибка - это предсказуемое поведение, а обработка ошибок - это направление ее в правильном направлении.

Это очень важно понимать - вы также можете использовать ошибки или исключения в своем собственном коде, чтобы управлять поведением вашего кода. Он не только используется для реакции на сторонние или косвенные инструменты, такие как БД или API.

Скажите мне - как справляться с ошибками

Давайте посмотрим на пару примеров, КАК ВЫ можете сделать это на практике. Как я упоминал в начале этой статьи, моя цель - дать вам понимание, ПОЧЕМУ все это важно. Поэтому примеры кода, которые я вам дам, просты.

JavaScript, как и многие другие языки программирования, имеет встроенный объект общей ошибки. На других языках это называется Исключение.

Пример объекта JS Error:

Вы можете передать собственное сообщение об ошибке в исключение, которое ВЫ выбрасываете, например:

Подобные исключения или ошибки JavaScript выдаст, когда что-то пойдет не так в вашем коде, при взаимодействии с API, БД или третьими сторонами и т. Д. Или вы можете выбросить их самостоятельно.

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

Для обработки ошибок вам нужно будет использовать блок try/catch. Это просто понять и с ним работать. У вас есть блок try, в который будет заключен код, в котором ВЫ ОЖИДАЕТЕ появление ошибки, и блок catch, в котором вы решите, что делать с ошибкой.

Например, вы можете отправить его в службу ведения журнала. Вы можете уведомить пользователя о том, что что-то пошло не так, с помощью красивого сообщения пользовательского интерфейса. Вы можете перенаправить пользователя в соответствующее место для лучшего опыта и т. Д.

Пример блока try/catch:

Здесь нам нужно осветить несколько вещей. Прежде всего, это чрезвычайно упрощенный пример, и ошибка, известная как Exception, может быть выброшена из функции, которую мы используем в этом блоке - ее не нужно напрямую бросать в блок try.

Во-вторых, на Line: 4 вы видите - catch принимает параметр. Это обязательный параметр, и вы можете дать ему любое имя. Если возникла ошибка, этот параметр автоматически примет объект ошибки, и вы сможете манипулировать им по своему усмотрению.

Блок «try» обертывает код там, где ВЫ ожидаете ошибки, блок «catch» - это то место, где вы ее обрабатываете.

Совет PRO

Прежде чем вы приступите к обработке ошибок, я дам вам совет, который навсегда изменит способ написания кода - «Используйте настраиваемые исключения!»

Пользовательское исключение

Мы рассмотрели общий объект Error(). Все отлично, вы можете ловить исключения и угадывать, что они означают, а также записывать сообщения об ошибках.

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

Если все эти исключения являются общими, единственный способ их различить - это их сообщение. Это не самый чистый и эффективный способ. Чтобы помочь нам с этой дилеммой, мы подошли к стадии Custom Exception.

Вот как вы создаете настраиваемое исключение в JavaScript.

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

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

Давайте посмотрим, каковы преимущества использования настраиваемых исключений.

Я понимаю, что это большой кусок, который нужно пройти. Позволь мне объяснить. С помощью настраиваемых исключений вы можете создавать типы ошибок и проверять эти типы при обнаружении ошибки. При обнаружении ошибки с помощью простого оператора if вы можете проверить, является ли ошибка экземпляром определенного типа. Если это так, вы можете выполнить определенное действие для конкретной ошибки.

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

Пользовательское исключение - это тип, который вы можете проверить на этапе «перехвата» и выполнить для него определенную логику.

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

Подведение итогов

Спасибо, что нашли время и прочитали эту статью. Я очень надеюсь, что вы получили хорошее представление и стали еще лучше инженером.

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

Хотите знать, что читать дальше?

Если вам понравился стиль этой истории, посмотрите мой профиль, у меня есть куча похожих историй. И я буду публиковать больше, регулярно.

Примечание на простом английском языке

Вы знали, что у нас четыре публикации и канал на YouTube? Вы можете найти все это на нашей домашней странице plainenglish.io - проявите немного любви, подписавшись на наши публикации и подписавшись на наш канал YouTube!