1

我在 Symfony 4.4 应用程序中有一个问题,其中有十几个侦听器正在侦听扩展的单个事件Symfony\Contracts\EventDispatcher\Event。问题是,如果其中一个侦听器抛出异常,那么后面的侦听器都不会被执行。

我正在寻找一种从侦听器中捕获异常的方法,这样就不会发生这种情况。我尝试扩展Symfony\Component\EventDispatcher\EventDispatcher和覆盖该callListeners()方法以包含try/catch以便我可以记录异常但继续执行。但我不知道如何告诉 Symfony 使用我的EventDispatcher而不是它自己的。

我不知道这是否是解决这个问题的推荐方法。知道如何让这个工作,或者是否有任何其他选择?

4

1 回答 1

1

如果抛出异常,则应该对其进行处理或停止执行。这就是例外的原因。

并且 Event Dispatcher 组件并不意味着异步使用,具有完全解耦的侦听器。它是按设计同步执行的,没有传输支持,并且所有侦听器都在同一个请求/执行线程上运行。

如果抛出一个 Exception 并且它没有被处理,则执行应该停止并且永远不会到达下一个侦听器。

即使您使用的是完全异步的解决方案,例如带有传输的 Symfony Messenger,抛出异常而不处理它也会阻止任何其他侦听器执行同一事件。

我认为您使用了错误的工具来完成这项工作。

如果您不想停止执行,您的侦听器不应抛出异常。处理监听器中的异常,并利用机会记录等。

于 2021-08-12T10:45:02.690 回答