Symfony 2.5 — я не могу поймать исключение PDOException

Я нахожусь на заключительной фазе создания нового проекта на основе Symfony 2.5, и я подумал, что было бы неплохо иметь собственные страницы ошибок. Я создал свой собственный Exception Listener, см. Код ниже:

Вот декларация сервиса:

kernel.listener.core_exception_listener:
class: MyCompany\CoreBundle\Listener\ExceptionListener
arguments: [@templating, @kernel]
tags:
- { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

Вот фактический класс PHP:

<?php
namespace MyCompany\CoreBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class ExceptionListener
{
protected $templating;
protected $kernel;

public function __construct(EngineInterface $templating, $kernel)
{
$this->templating = $templating;
$this->kernel = $kernel;
}

public function onKernelException(GetResponseForExceptionEvent $event)
{
// provide the better way to display a enhanced error page only in prod environment, if you want
if ('prod' == $this->kernel->getEnvironment()) {
// exception object
$exception = $event->getException();

// new Response object
$response = new Response();

if($exception instanceof NotFoundHttpException) {
$template = 'CoreBundle:Exception:404.html.php';
} else {
$template = 'CoreBundle:Exception:exception.html.php';
}

$response->setContent(
// create you custom template AcmeFooBundle:Exception:exception.html.twig
$this->templating->render(
$template,
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);
}
}
}

Это прекрасно работает с 404 страницами, но, к сожалению, не работает с исключениями PDOException. В качестве примера я остановил свой сервер MySQL и обновил страницу, вместо своей пользовательской страницы ошибок я фактически получаю журнал трассировки исключений и код ответа HTTP 200 (например, wtf .. :))

Любые советы?
Спасибо

П.С .: Создание файла приложения / Resources / TwigBundle / views / Exception / error.html.twig не имеет абсолютно никакого эффекта ..

P.P.S .: Добавление свойства приоритета в декларацию сервиса также не влияет.

1

Решение

Чтобы поймать PDOException, вы должны пространство имен это.
Либо добавьте его как оператор использования, либо добавьте ведущий \, когда он вызывается.
Например;

try {
// your code
} catch (\PDOException $pdo_ex) {
die("Oops, ".$pdo_ex->getMessage());
}
1

Другие решения

Это код, помогите мне с ошибками Expections от http://www.inanzzz.com/index.php/post/nm7o/catching-orm-dbal-and-pdo-exceptions-in-symfony

   $em = $this->getDoctrine()->getEntityManager();

try {
$em->persist($country);
$em->flush();
$message = 'Done';
} catch (DBALException $e) {
$message = sprintf('DBALException [%i]: %s', $e->getCode(), $e->getMessage());
} catch (PDOException $e) {
$message = sprintf('PDOException [%i]: %s', $e->getCode(), $e->getMessage());
} catch (ORMException $e) {
$message = sprintf('ORMException [%i]: %s', $e->getCode(), $e->getMessage());
} catch (Exception $e) {
$message = sprintf('Exception [%i]: %s', $e->getCode(), $e->getMessage());
}

echo $message;
}

}

0

По вопросам рекламы [email protected]