Захват исключений с помощью другого обработчика для приложений REST

Проблема

Я создаю небольшое приложение с Silex . Он разделен между приложением REST и веб-сайтом. ( два контроллера , одно приложение). На веб-сайте установлен собственный собственный обработчик ошибок , который возвращает удобную страницу html. Проблема в том, что в части, посвященной REST-приложению, я должен каким-то образом обрабатывать исключения типа return [json] и контента, отличного от пользовательского веб-сайта обработчика ошибок.

С Symfony2

Этот аргумент может быть применен и к Symfony2, я также хотел бы, чтобы это было возможным решением!

Первое решение для Silex

Оберните методы в блок try-catch, чтобы переустановить исключение для обработчика.

$app->get('/api/show-list', function() use($app){ try { $show = // db query, etc. return $app->json(array('show' => $show), 200); } catch (Exception $e) { throw new MyException; } }); $app->error(function (MyException $e, $code) { // error api }); 

Проблема в том, что если исключение выбрасывается из моего контролера, будет использоваться обработчик ошибок по умолчанию. Некоторые советы? И с Симфонией?

Solutions Collecting From Web of "Захват исключений с помощью другого обработчика для приложений REST"

Я использовал следующее в моем приложении Silex RESTful для возврата ошибок в формате json:

 $app->error(function (\Exception $e, $code) use($app) { return $app->json(array("error" => $e->getMessage()),$code); }); 

Не уверен, что это правильный путь, но он работает для меня.

Это описано на сайте Silex: http://silex.sensiolabs.org/doc/usage.html#error-handlers

На Symfony2 вы можете использовать ExceptionHandler. В Exception у вас есть трассировка стека, поэтому вы можете определить, где она была выбрана.

Кроме того, в Symfony2 вы можете настроить в зависимости от ожидаемого формата. Это хорошо объяснено в документации .

Например, если вы замените ExceptionController на один из ваших, третий параметр отобразит ожидаемый формат:

Ссылка на замену ExceptionController

API ExceptionController