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

Метод getNestedExceptions

Класс HandlerFailedException выбрасывается шиной сообщений Symfony, когда один или несколько обработчиков сообщения завершаются с ошибкой. Метод getNestedExceptions возвращает массив исключений, которые были выброшены внутри обработчиков. Это позволяет получить доступ к исходным ошибкам, а не только к обёртке. Метод не принимает параметров и возвращает массив объектов Throwable.

Синтаксис

public function getNestedExceptions(): array

Пример

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

<?php namespace AppMessageHandler; use AppMessageArticleMessage; use SymfonyComponentMessengerHandlerMessageHandlerInterface; use SymfonyComponentMessengerExceptionHandlerFailedException; class ArticleMessageHandler implements MessageHandlerInterface { public function __invoke(ArticleMessage $message): void { throw new RuntimeException('Handler failed'); } } ?>

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

<?php namespace AppController; use AppMessageArticleMessage; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentMessengerExceptionHandlerFailedException; use SymfonyComponentMessengerMessageBusInterface; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article', name: 'article_send')] public function send(MessageBusInterface $bus): Response { try { $bus->dispatch(new ArticleMessage('abcde')); } catch (HandlerFailedException $e) { $nested = $e->getNestedExceptions(); foreach ($nested as $exception) { echo $exception->getMessage(); } } return new Response('done'); } } ?>

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

"Handler failed"

Пример

Давайте рассмотрим случай, когда в шине зарегистрировано несколько обработчиков и каждый выбрасывает своё исключение:

<?php namespace AppMessageHandler; use AppMessageArticleMessage; use SymfonyComponentMessengerHandlerMessageHandlerInterface; class FirstHandler implements MessageHandlerInterface { public function __invoke(ArticleMessage $message): void { throw new RuntimeException('First error'); } } ?>
<?php namespace AppMessageHandler; use AppMessageArticleMessage; use SymfonyComponentMessengerHandlerMessageHandlerInterface; class SecondHandler implements MessageHandlerInterface { public function __invoke(ArticleMessage $message): void { throw new LogicException('Second error'); } } ?>

Теперь получим все вложенные исключения в контроллере:

<?php namespace AppController; use AppMessageArticleMessage; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentMessengerExceptionHandlerFailedException; use SymfonyComponentMessengerMessageBusInterface; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article', name: 'article_send')] public function send(MessageBusInterface $bus): Response { try { $bus->dispatch(new ArticleMessage('abcde')); } catch (HandlerFailedException $e) { $messages = []; foreach ($e->getNestedExceptions() as $exception) { $messages[] = $exception->getMessage(); } return new Response(implode(', ', $messages)); } return new Response('done'); } } ?>

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

"First error, Second error"

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

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