Docker上的Symfony4 Uncaught BadRequestHttpException

时间:2018-12-18 03:21:51

标签: php symfony docker symfony4

我创建了一个代理api,以在symfony4中的肥皂和休息之间建立桥梁。为了正确捕获我的肥皂异常,我在下面创建了侦听器。在本地,我的肥皂异常被捕获并抛出为BadRequestHttpException。在Docker容器上部署代码时,出现以下错误:Uncaught Symfony\\Component\\HttpKernel\\Exception\\BadRequestHttpException:

有我的记者:

class TrinityListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::EXCEPTION => array('onKernelException', -64),
        );
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        if (($e = $event->getException()) instanceof \SoapFault) {
            throw new BadRequestHttpException($e->getMessage());
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您的问题与Docker无关。

您创建了一个 TrinityListener ,该监听器正在监听 kernel.exception 事件(实际上是一个GetResponseForExceptionEvent对象)。发生此事件时,将执行 onKernelException 方法,并且异常情况是在此处未正确捕获而抛出异常。您最初的异常是\SoapFault的实例,因此您抛出了 BadRequestHttpException ,这很好,但是没有捕获到该异常。就是这个问题,错误非常明显,您应该使用 try ... catch 来解决此问题。

Exception来自php文档:

  

引发异常时,将不执行该语句之后的代码,PHP将尝试查找第一个匹配的catch块。如果未捕获到异常,除非已使用set_exception_handler()定义了处理程序,否则将通过“ Uncaught Exception ...”消息发出PHP致命错误。

因此您可以通过以下方式解决问题:

class TrinityListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(
            KernelEvents::EXCEPTION => array('onKernelException', -64),
        );
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        try {
            if (($e = $event->getException()) instanceof \SoapFault) {
                throw new BadRequestHttpException($e->getMessage());
            }
        } catch (BadRequestHttpException $e) {
            $response = new Response();
            $message = sprintf(
                'Error %s with code: %s',
                $exception->getMessage(),
                $exception->getCode()
            );
            $response->setContent($message);
            $response->setStatusCode($exception->getStatusCode());
            $event->setResponse($response);
        }
    }
}

答案 1 :(得分:0)

以下方法可以更轻松地完成同一件事:

public function onKernelException(GetResponseForExceptionEvent $event)
{
    if ($event->getException() instanceof \SoapFault) {
        $response = new Response();
        $response->setStatusCode(Response::HTTP_BAD_REQUEST);
        $response->setContent($event->getException()->getMessage());
        $event->setResponse($response);
    }
}