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