paint-brush
Истинная важность исключений: обработка ошибок в PHP и Golangк@shcherbanich
8,393 чтения
8,393 чтения

Истинная важность исключений: обработка ошибок в PHP и Golang

к Filipp Shcherbanich7m2023/10/20
Read on Terminal Reader
Read this story w/o Javascript

Слишком долго; Читать

Оглядываясь назад, можно сказать, что то, как мы справлялись с ошибками, показывает, как со временем менялись потребности и проблемы разработчиков.
featured image - Истинная важность исключений: обработка ошибок в PHP и Golang
Filipp Shcherbanich HackerNoon profile picture

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


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

Методы обработки ошибок: погружение в PHP и Golang

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


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


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


Вскоре после этого обратные вызовы ошибок получили распространение, особенно в асинхронных средах. Идея была проста: вместо того, чтобы ждать ошибки, почему бы не передать функцию (обратный вызов) для ее обработки? Шаблон onError(callback) стал популярным в JavaScript, что сделало обработку ошибок более активной.


В некоторых языках программирования введены специальные функции, позволяющие работать с ошибками и исключениями. Например, в LUA есть error() и pcall() . Они предлагали сочетание традиционных кодов ошибок и механизмов исключений.


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


Но давайте переключим внимание на PHP и Golang. PHP обладает обширными возможностями обработки ошибок. До версии 5.0 исключений в этом языке программирования вообще не было. Разработчики использовали широкий спектр методов обработки ошибок, таких как функция trigger_error , которая генерирует сообщение об ошибке/предупреждении/уведомлении на уровне пользователя; функция set_error_handler , позволяющая определить в скрипте обратный вызов для обработки ошибок, активно возвращающий «false» или «null» в результате неудачного выполнения функции и т. д.


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


Golang, с другой стороны, имеет дело с шаблоном множественного возврата, где функции возвращают как результат, так и ошибку, делая упор на явную проверку ошибок, а не на неявную обработку исключений. Создатели Golang придерживаются принципа, что язык программирования должен быть максимально понятным и простым. Основная цель его разработки заключалась в предоставлении понятных и эффективных языковых конструкций для написания кода, особенно в таких крупных организациях, как Google. Таким образом, разработчики могли сосредоточиться на решении проблем, не тратя время на споры о стиле кода или попытки разобраться в сложном и запутанном коде.

Обработка ошибок в PHP и Golang: сравнение читабельности

Подход PHP к исключениям

Как отмечалось ранее, PHP имеет множество возможностей обработки ошибок, но в наши дни наиболее популярным методом являются исключения. Хотя этот подход интуитивно понятен и отражает многие другие языки программирования, он может привести к вложенным структурам — ситуации, когда приходится иметь дело с несколькими потенциальными источниками ошибок. Такая вложенность типа «try-catch» может затруднить чтение кода, особенно для новичков. Давайте разберемся.

ПРЕИМУЩЕСТВА:

  • Краткость . Обработка исключений PHP может привести к созданию лаконичного кода, сокращая общее количество необходимых строк. Это особенно полезно при работе с различными типами ошибок в одном сегменте кода. Он обеспечивает централизованный механизм обработки ошибок.
  • Универсальность. Будучи похожим на многие другие языки, механизм исключений PHP знаком многим разработчикам и облегчает переход на PHP из других языков программирования. Самый популярный на данный момент язык программирования имеет такой способ борьбы с ошибками.

НЕДОСТАТКИ:

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

Явная обработка ошибок Golang

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


ПРЕИМУЩЕСТВА:

  • Простота потока управления. Поскольку Go не использует исключения для обработки ошибок, нет необходимости в блоках «try-catch» — это снижает сложность потока управления.
  • Гибкость . Подход Golang позволяет разработчикам решать, как обрабатывать каждую ошибку в каждом конкретном случае, будь то путем ее распространения, регистрации или принятия корректирующих мер. Этот контроль может привести к созданию более надежных приложений.

НЕДОСТАТКИ:

  • Длинность. Одна из наиболее распространенных критических замечаний заключается в том, что обработка ошибок в Go может привести к созданию многословного кода. Функции, которые могут дать сбой, должны возвращать дополнительное значение ошибки, и обработка этих ошибок часто может привести к повторяющемуся шаблону проверки ошибок.
  • Возможность надзора. Поскольку обработка ошибок является явной, может возникнуть риск, что разработчики забудут или намеренно не проверят ошибку.
  • Отсутствие контекста . Хотя стандартный тип ошибки Go прост и последователен, ему часто не хватает контекстной информации о том, где и почему произошла ошибка. Хотя существуют пакеты и шаблоны для добавления большего контекста, они не настолько интегрированы, как хотелось бы некоторым разработчикам.

Различия в производительности и потреблении ресурсов

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


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


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


Решение между использованием метода PHP на основе исключений или явной обработки ошибок Golang касается не только производительности и ресурсов, но и компромиссов. Исключения предоставляют массу отладочной информации, но за них приходится платить; Подход Golang, в свою очередь, экономит ресурсы, но требует тщательного управления ошибками.

Заключение: можно и нужно ли жить без исключений?

PHP, рожденный из потребностей веб-разработки, отдавал приоритет простоте и общему хостингу. Обработка ошибок делает его удобным для разработчиков веб-приложений. С другой стороны, Golang, созданный гигантами программного обеспечения Google, был разработан для современного системного программирования. Он делает упор на явную обработку ошибок с использованием нескольких возвращаемых значений: эта парадигма способствует более четкому потоку кода и делает ошибки обычными значениями, обеспечивая более точный контроль.


Разное происхождение и цели сформировали их философию обработки ошибок. PHP нацелен на широкое распространение среди веб-разработчиков, которые ценят доступность и удобство. Напротив, Golang стремился к производительности, ясности и надежности, идеально подходящим для масштабируемых и удобных в обслуживании систем.


Их подходы неизбежно вызывают дебаты о необходимости исключений.


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


Что касается меня, то, несмотря на возможные недостатки исключений, я из тех разработчиков, которые предпочитают использовать их в своей работе, если это возможно. Подход Golang мне кажется менее комфортным, но он также заставляет меня больше думать о том, что я делаю и чего хочу достичь. Какой метод вам нравится использовать больше? Буду рада, если вы поделитесь этой информацией в комментариях!