Метод getWrappedExceptions
Метод getWrappedExceptions принадлежит классу
HandlerFailedException и возвращает массив
исключений, которые были выброшены обработчиками
сообщения. Когда сообщение проходит через шину
и один или несколько обработчиков падают с ошибкой,
Symfony оборачивает их в исключение
HandlerFailedException. Метод
getWrappedExceptions позволяет извлечь
исходные исключения и работать с каждым из них
отдельно.
Первым параметром можно передать имя класса
исключения, чтобы отфильтровать результаты.
Вторым параметром передаётся флаг
$asString, который при значении true
вернёт имена классов вместо объектов исключений.
Синтаксис
public function getWrappedExceptions(?string $className = null, bool $asString = false): array
Пример
Давайте создадим обработчик, который выбрасывает
исключение, и посмотрим, что вернёт метод
getWrappedExceptions:
<?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('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
try {
$bus->dispatch(new ArticleMessage('abcde'));
} catch (HandlerFailedException $e) {
$res = $e->getWrappedExceptions();
foreach ($res as $exception) {
echo $exception->getMessage();
}
}
return new Response();
}
}
?>
Результат выполнения кода:
"handler failed"
Пример
Давайте отфильтруем исключения по классу
RuntimeException:
<?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('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
try {
$bus->dispatch(new ArticleMessage('abcde'));
} catch (HandlerFailedException $e) {
$res = $e->getWrappedExceptions(\RuntimeException::class);
foreach ($res as $exception) {
echo $exception->getMessage();
}
}
return new Response();
}
}
?>
Результат выполнения кода:
"handler failed"
Пример
Давайте передадим второй параметр $asString
как true, чтобы получить имена классов
исключений:
<?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('/', name: 'article_index')]
public function index(MessageBusInterface $bus): Response
{
try {
$bus->dispatch(new ArticleMessage('abcde'));
} catch (HandlerFailedException $e) {
$res = $e->getWrappedExceptions(null, true);
foreach ($res as $className) {
echo $className;
}
}
return new Response();
}
}
?>
Результат выполнения кода:
"RuntimeException"
Смотрите также
-
класс
HandlerFailedException,
который оборачивает ошибки обработчиков -
метод
getNestedExceptions,
который возвращает вложенные исключения -
метод
dispatch,
который отправляет сообщение в шину -
класс
MessageBus,
который управляет обработкой сообщений