gpt4 book ai didi

php - 如何使用 Symfony 4 中的事件处理异常?

转载 作者:行者123 更新时间:2023-12-05 09:12:40 26 4
gpt4 key购买 nike

现在我正在 try catch 这样的异常事件:

try {
echo 1 / 0;
} catch (\Exception $e){
$subs = new ExceptionSubscriber();
$this->dispatcher->addSubscriber($subs);
};

我已经定义了如下所示的 ExceptionSubscriber:

class ExceptionSubscriber implements EventSubscriberInterface
{

public static function getSubscribedEvents()
{
return [
KernelEvents::EXCEPTION => [
['processException', 10],
['exception', -10],
],
];
}

public function exception(ExceptionEvent $event)
{
echo 'test321';
}

public function processException(ExceptionEvent $event)
{
echo 'test123';
}
}

这是我的 services.yaml

App\EventSubscriber\ExceptionSubscriber:
tags:
- { name: kernel.event_subscriber, event: kernel.exception }

我知道我捕获的常规 PHP 异常不是内核异常事件之一,在那种情况下我必须创建自定义异常事件,对吗?

我使用 EventSubscriber 发送事件的方式很好,而不是监听器

我是否必须分派(dispatch)这些事件,或者它们以某种神奇的方式传递给订阅者?

最佳答案

当抛出一个Exception(并且它没有被处理)时,HttpKernel 会捕获它并派发一个kernel.exception 事件。

但在您的示例中,这永远不会发生,因为您自己正在捕获异常。并试图在那里创建一个订阅者,这没有多大意义;如果有的话,你会 dispatch 一个事件。但是派发新事件不是必需的,因为框架已经派发了 kernel.exception 事件。

如果你想捕捉那个事件,你需要创建你自己的事件监听器。一个基本的例子:

class ExceptionListener
{
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getException();

// inspect the exception
// do whatever else you want, logging, modify the response, etc, etc
}
}

你需要配置这个类来实际监听这些事件:

services:
App\EventListener\ExceptionListener:
tags:
- { name: kernel.event_listener, event: kernel.exception }

除此之外别无他法。任何未捕获的异常都将通过这里。无需创建特定的 try/catch block (尽管一般来说它们是个好主意,因为处理您自己的异常通常是一件好事)。

这一切都在这些地方的文档中进行了解释,其中包括:

关于php - 如何使用 Symfony 4 中的事件处理异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57572597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com