Этот вопрос проверяет понимание того, как создавать и использовать пользовательские классы исключений для структурированной обработки специфичных для предметной области ошибок.
Кастомные исключения — это пользовательские классы, которые наследуются от базового класса Exception (или его потомков). Они нужны для того, чтобы явно и понятно различать типы ошибок в приложении. Вместо того чтобы везду использовать общее Exception, вы создаете, например, PaymentFailedException или InsufficientFundsException. Это позволяет точнее перехватывать и обрабатывать конкретные ошибки, добавлять в них специфичную информацию и улучшает читаемость кода.
Использование кастомных исключений — это признак хорошо структурированного и продуманного приложения.
Семантика и читаемость: Имя исключения само говорит о природе ошибки. throw new InsufficientFundsException() гораздо понятнее, чем throw new Exception('Not enough money').
Точный перехват: Вы можете перехватывать не все исключения подряд, а только те, которые можете обработать.
try {
$user->makePayment($order);
} catch (InsufficientFundsException $e) {
// Предложить пользователю пополнить баланс
} catch (PaymentGatewayTimeoutException $e) {
// Повторить запрос к платежному шлюзу
} catch (Exception $e) {
// Общая обработка всех остальных ошибок
}Дополнительный контекст: В кастомный класс исключения можно добавить методы и свойства для передачи дополнительной информации.
throw new PaymentFailedException($paymentGateway, $responseCode);Просто создайте класс, наследуемый от Exception.
<?php
class InsufficientFundsException extends Exception
{
protected $currentBalance;
protected $requiredAmount;
public function __construct($currentBalance, $requiredAmount, $message = "Insufficient funds", $code = 0, Throwable $previous = null)
{
$this->currentBalance = $currentBalance;
$this->requiredAmount = $requiredAmount;
$message = sprintf("%s. Current: %.2f, Required: %.2f", $message, $currentBalance, $requiredAmount);
parent::__construct($message, $code, $previous);
}
public function getCurrentBalance()
{
return $this->currentBalance;
}
}
// Использование
if ($user->balance < $order->total) {
throw new InsufficientFundsException($user->balance, $order->total);
}Вывод:
Создавайте кастомные исключения для ошибок, специфичных для бизнес-логики вашего приложения. Это мощный инструмент для создания чистого, поддерживаемого и надежного кода, который точно и понятно сообщает о возникающих проблемах.