Почему исключения не перехватываются при переопределении шаблонов ошибок?

Я следовал документации Symfony2.2 по настройке шаблонов ошибок и переопределил шаблон ошибки по умолчанию в app/Resources/TwigBundle/views/Exception/error.html.twig, как описано для Twig.

В некоторых контроллерах я выдаю пользовательский 404, например, когда объект БД не существует. Я делаю это с:

throw $this->createNotFoundException('Thing not found');

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

Похоже, что showAction контроллера исключений Twig выполняется, но исключение по-прежнему выбрасывается из стека.

Что нужно сделать, чтобы исключение было перехвачено и обработано?

Дополнительная информация:

Записывается следующее. (изменено только имя клиента)

[2013-05-22 16:26:22] request.INFO: Matched route "show_thing" (parameters: "_controller": "Client\SiteBundle\Controller\ThingController::indexAction", "id": "thing", "_route": "show_thing") [] []
[2013-05-22 16:26:22] security.INFO: No expression found; abstaining from voting. [] []
[2013-05-22 16:26:22] request.ERROR: Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\NotFoundHttpException: "thing not found" at /home/vhosts/client/symfony/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php line 149 [] []

person Tim    schedule 22.05.2013    source источник
comment
Просто чтобы уточнить... если ваш шаблон существует... исключение не перехвачено... если оно не существует... symfony правильно показывает страницу ошибки 404? Вы проверили свои лог-файлы, возможно, есть исключения при перерисовке шаблона?   -  person Nicolai Fröhlich    schedule 22.05.2013
comment
app/Resources/TwigBundle/views/Exception/error404.html.twig это файл, который вы создали?   -  person Nicolai Fröhlich    schedule 22.05.2013
comment
Я пробовал как с error.html.twig, так и с error404.html.twig. Re ваше уточнение: да. Он отлично работает, если я удалю свой собственный шаблон.   -  person Tim    schedule 22.05.2013
comment
больше ничего в логах. Неперехваченное исключение - это то, которое я сам бросил (NotFoundHttpException)   -  person Tim    schedule 22.05.2013
comment
Что похоже на выполнение showAction контроллера исключений Twig - вы его отладили и оно наверняка выполняется?   -  person Nicolai Fröhlich    schedule 22.05.2013
comment
да. Я выгрузил исключение и проверил его прямо перед тем, как showAction вернет новый ответ. До сих пор бросает,   -  person Tim    schedule 22.05.2013


Ответы (2)


Я разобрался.

В моем шаблоне был блок, который не был определен в макете.

Эта ошибка не была зарегистрирована, но ее было достаточно, чтобы прервать рендеринг,

Спасибо @nifr за вашу помощь.

person Tim    schedule 22.05.2013

Ваша проблема связана с методом createNotFoundException в контроллере Symfony.

Symfony API — Symfony/Bundle/FrameworkBundle/Controller/Controller< /а>

Код на GitHub

Чтобы показать собственный шаблон ошибки, вы должны использовать Symfony в среде prod, так как исключения перехватываются только там.

В среде разработки symfony использует собственный модифицированный обработчик ошибок php для отображения трассировки стека. Эти исключения не перехватываются, просто отображаются обработчиком ошибок.

Вы проверили, что прослушиватель исключений ядра правильно зарегистрирован в сервисном контейнере?

app/console container:debug --show-private
person Nicolai Fröhlich    schedule 22.05.2013
comment
да, я переключаю свой фронт-контроллер на prod, чтобы протестировать шаблоны. - person Tim; 22.05.2013
comment
вставьте полный текст сообщения в app/logs/prod.log - person Nicolai Fröhlich; 22.05.2013