Метод 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,
который отправляет сообщение в шину