我创建了一个代理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());
}
}
}
答案 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);
}
}