Я пытаюсь создать слушателя для прослушивания 403, 404 и 500 исключений. Это отлично работает для 403 и 404 исключений, но не для 500 исключений. За 500 исключений (или исключений, которые будут возвращены как 500 ошибок для клиента) метод onKernelException никогда не вызывается. В моем текущем проекте Symfony это похоже, и когда код добавлен в чистую установку Symfony 2.4.1.
Затем я ввожу ошибку 500 путем выполнения несуществующей функции.
В среде разработки я получаю созданную Symfony страницу с надписью «Упс, похоже, что что-то пошло не так». а затем просматривает информацию о брошенном «UndefinedFunctionException» вместе с кодом состояния 500.
В производственной среде я получаю пустую страницу вместе с кодом состояния 500. В журнале ошибок prod.log я получаю сообщение «Ошибка фатальной ошибки: вызов неопределенной функции» с трассировкой стека.
Поскольку Symfony, очевидно, ловит эту ошибку, почему я не могу уловить соответствующее исключение с помощью прослушивателя kernel.exception?
Класс, который я использую:
<?php namespace SystemBundle\Listener; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface; /** * This exception listener will listen to 500, 404, and 403 errors and render a corresponding view * * @SuppressWarnings("static") * @SuppressWarnings("else") */ class ExceptionListener { protected $templating; protected $kernel; public function __construct(EngineInterface $templating, $kernel) { $this->templating = $templating; $this->kernel = $kernel; } public function onKernelException(GetResponseForExceptionEvent $event) { $container = $this->kernel->getContainer(); // Exception object $exception = $event->getException(); // Create Response object $response = new Response(); // Get view name $viewName = $container->getParameter('theme') . ':Exception:exception.html.twig'; if (!$this->templating->exists($viewName)) { $viewName = 'AckebrinkChallengerSystemBundle:Exception:exception.html.twig'; } // Set response content $response->setContent($this->templating->render($viewName, array('exception' => $exception))); // HttpExceptionInterface is a special type of exception that // holds status code and header details if ($exception instanceof HttpExceptionInterface) { $response->setStatusCode($exception->getStatusCode()); $response->headers->replace($exception->getHeaders()); } else { $response->setStatusCode(500); } // set the new $response object to the $event $event->setResponse($response); } }
и используемая конфигурация сервиса:
services: kernel.listener.system_exception_listener: class: SystemBundle\Listener\ExceptionListener arguments: - @templating - @kernel tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Прежде всего, убедитесь, что вы очистили кеш Prod.
Во-вторых, посмотрите, что-то на веб-сервере ловит ошибки для вас, то есть fastcgi_intercept_errors в Nginx, но это вряд ли произойдет.
В-третьих, попробуйте сделать исключение вместо вызова не объявленной функции.
В-четвертых, попробуйте установить $ event-> setResponse как можно раньше в прослушиватель исключений, чтобы убедиться, что в самом обработчике нет ошибки.
Кроме этого, я понятия не имею. Код выглядит нормально. Вы пробовали с XDebug посмотреть, как происходит поток кода?
В PHP 7 введены исключения фатальной ошибки. Если вы находитесь в PHP 5.X, приложение останавливается.