РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1348 of 1361 menu

Класс HandlerFailedException

Класс HandlerFailedException находится в пространстве имён Symfony\Component\Messenger\Exception и наследуется от RuntimeException. Он выбрасывается шиной сообщений MessageBus, когда обработчик сообщения завершается исключением. Внутри себя класс хранит исходное исключение обработчика и обёртку сообщения Envelope, которую обрабатывал шина. Через методы getNestedExceptions и getWrappedExceptions можно получить доступ к исходным ошибкам.

Синтаксис

<?php namespace Symfony\Component\Messenger\Exception; class HandlerFailedException extends RuntimeException { public function __construct( Envelope $envelope, array $exceptions ) { } public function getEnvelope(): Envelope { } public function getNestedExceptions(): array { } public function getWrappedExceptions( ?string $class = null, bool $children = false ): array { } } ?>

Пример

Давайте создадим обработчик, который бросает исключение, и поймаем его через HandlerFailedException:

<?php namespace App\MessageHandler; use App\Message\ArticleMessage; use Symfony\Component\Messenger\Attribute\AsMessageHandler; #[AsMessageHandler] class ArticleMessageHandler { public function __invoke(ArticleMessage $message): void { throw new \RuntimeException('handler failed'); } } ?>

Теперь отправим сообщение и перехватим исключение:

<?php namespace App\Controller; use App\Message\ArticleMessage; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article', name: 'article_send')] public function send(MessageBusInterface $bus): Response { try { $bus->dispatch(new ArticleMessage('hello')); } catch (HandlerFailedException $e) { foreach ($e->getNestedExceptions() as $nested) { echo $nested->getMessage(); } } return new Response('done'); } } ?>

Результат выполнения кода:

"handler failed"

Пример

Давайте отфильтруем вложенные исключения по классу через getWrappedExceptions:

<?php namespace App\Controller; use App\Message\ArticleMessage; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Messenger\Exception\HandlerFailedException; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; class ArticleController extends AbstractController { #[Route('/article/filter', name: 'article_filter')] public function filter(MessageBusInterface $bus): Response { try { $bus->dispatch(new ArticleMessage('abcde')); } catch (HandlerFailedException $e) { $errors = $e->getWrappedExceptions(\RuntimeException::class); foreach ($errors as $error) { echo $error->getMessage(); } } return new Response('done'); } } ?>

Результат выполнения кода:

"handler failed"

Смотрите также

  • метод getNestedExceptions,
    который возвращает все вложенные исключения
  • метод getWrappedExceptions,
    который фильтрует вложенные исключения по классу
  • класс MessageBus,
    который выбрасывает данное исключение
  • метод dispatch,
    который запускает обработку сообщения
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить