Ответ
Да, создание собственных классов исключений — это лучшая практика для точной обработки ошибок, специфичных для бизнес-логики приложения.
Пример создания и использования:
// Пользовательское исключение для ошибок валидации
class ValidationException extends InvalidArgumentException {
private array $errors;
public function __construct(string $message, array $errors = [], int $code = 0, ?Throwable $previous = null) {
parent::__construct($message, $code, $previous);
$this->errors = $errors;
}
public function getErrors(): array {
return $this->errors;
}
}
// Использование в сервисе
class UserRegistrationService {
public function register(array $data): void {
$errors = $this->validate($data);
if (!empty($errors)) {
throw new ValidationException('Ошибка валидации данных пользователя', $errors);
}
// ... логика регистрации
}
}
// Точечная обработка
try {
$service->register(['email' => 'invalid']);
} catch (ValidationException $e) {
echo $e->getMessage();
foreach ($e->getErrors() as $error) {
echo "- $errorn";
}
}
Преимущества:
- Семантика: Исключения отражают конкретную проблему (
ValidationException,PaymentFailedException). - Точный перехват: Можно ловить только нужные типы исключений, не обрабатывая все через общий
Exception. - Дополнительные данные: Класс исключения может содержать специфичную для ошибки информацию (как
$errorsв примере выше).