Зачем использовать пользовательские исключения в PHP

Источник: «Why to use Custom Exceptions in PHP»
При создании PHP-приложений исключения играют важную роль в обработке ошибок и сбоев, возникающих во время жизненного цикла приложения. Рассмотрим, как использовать пользовательские исключения для улучшения приложений.

Введение

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

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

Преимущества использования исключений

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

Улучшенная обработка ошибок

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

Управляемый логический поток

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

Подробная информация об ошибках

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

Цепочка исключений

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

throw new MyCustomException(message: "Something went wrong", code: 500 , previous: $previousException);

Гибкость и расширяемость

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

Общие исключения

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

Базовый пример использования общего исключения:

try {
// Код который может выбросить исключение
$result = 5 / 0; // Это приведёт к ошибке деления на ноль
} catch (Exception $exception) {
// Обработка исключения
}

В приведённом выше примере есть блок try, содержащий код, который может выбросить исключение (в данном случае деление на ноль). Если исключение возникнет где-либо внутри блока try, выполнение немедленно перейдёт в блок catch, где исключение будет обработано.

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

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

Пользовательские исключения в PHP позволяют разработчикам определять собственные типы исключений. Они могут быть использованы для обработки определённых условий ошибок более структурированным и осмысленным способом. Пользовательские исключения создаются путём расширения базового класса Exception и могут включать дополнительные свойства и методы для более подробного описания ошибок.

Зачем нужны пользовательские исключения

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

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

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

Как использовать пользовательские исключения

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

try {
// Пользовательская логика приложения
if (! $this->isValidTaxNumber($taxNumber)) {
throw new Exception('The tax number is incorrect');
}
} catch (Exception $exception) {
$this->buildResponse($exception);
}

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

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

use Exception;
use Symfony\Component\HttpFoundation\Response;

final class InvalidTaxNumberException extends Exception {
public function __construct()
{
parent::__construct('The tax number is incorrect', Response::HTTP_UNPROCESSABLE_ENTITY);
}
}

Затем с помощью нового класса InvalidTaxNumberException можно обновить логику, чтобы его использовать:

try {
// Пользовательская логика приложения
if (! $this->isValidTaxNumber($taxNumber)) {
throw new InvalidTaxNumberException();
}
} catch (InvalidTaxNumberException $exception) {
$this->buildResponse($exception);
} catch (Exception $exception) {
$this->handleGenericException($exception);
}

Можно заметить, что теперь, когда пользователь указывает неверный налоговый номер, вызывается определённое исключение, аналогичное тому, которое было создано ранее, что позволяет проводить более надёжную и точную обработку ошибок, чем раньше. Вы также видите, что при необходимости можно определить несколько блоков catch для обработки различных типов исключений. В данном случае при возникновении исключения InvalidTaxNumberException вызывается метод buildResponse, но при возникновении любого другого типа исключения вызывается handleGenericException, чтобы можно было более точно определить, что возвращать пользователю.

Заключение

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

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

Надеюсь, вам понравилась эта статья, и если да, то не забудьте поделиться ею со своими друзьями!!! До встречи!

Дополнительные материалы

Предыдущая Статья

Как исключить middleware в определённых роутах Laravel

Следующая Статья

Рефакторинг метода с опциональными параметрами