Я пытаюсь выяснить, как создать настраиваемое поведение исключения. Когда я бросаю исключение, используя
throw new \Exception('Error occurred with your request please try again');
Я автоматически получаю статус 500, а сообщение – как внутренняя ошибка сервера
Однако вместо этого я бы хотел, чтобы мой ответ включал мое сообщение об исключении, а не только внутреннюю ошибку сервера, поэтому для отображения чего-то вроде этого:
{ "error":{ "code":500, "message":"Error occurred with your request please try again" } }
и, кроме того, возможно, некоторые дополнительные вещи, такие как электронная почта сама ошибка. Однако я только хочу, чтобы это произошло, когда я выбрал \ Exception, а не использовал что-то вроде
throw new HttpException
Любая помощь или идеи о том, как это сделать.
Я должен также упомянуть, что я не использую Twig или любые шаблоны для этого. Это строго ответ типа API
Взгляните на http://symfony.com/doc/current/cookbook/controller/error_pages.html. Для начала вам достаточно информации.
Короче говоря, вы должны создать приложение / Resources / TwigBundle / views / Exception / exception.json.twig и там у вас есть доступ к exception.message и error_code.
вот решение для вас:
{% spaceless %} { "error":{ "code": {{ error_code }}, "message":{{ exception.message }} } } {% endspaceless %}
Другим решением является использование Exception Listener:
namespace Your\Namespace; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; class JsonExceptionListener { public function onKernelException(GetResponseForExceptionEvent $event) { $exception = $event->getException(); $data = array( 'error' => array( 'code' => $exception->getCode(), 'message' => $exception->getMessage() ) ); $response = new JsonResponse($data); $event->setResponse($response); } }
обновите конфигурацию своих сервисов:
json_exception_listener: class: Your\Namespace\JsonExceptionListener tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 200 }
ура
Если вы хотите прочитать сообщение, которое вы отправляете обратно, вам нужно вернуть код ответа, который возвращает текст с ответом, например, 200. Таким образом, вы можете сделать что-то вроде этого с помощью блока try catch
:
try{ //..... throw new \Exception('Error occurred with your request please try again'); }catch(\Exception $ex){ $return = array('error'=>array('code'=>500,'message'=>$ex->getMessage())); return new Response(json_encode($return),200,array('Content-Type' => 'application/json')); }
и на стороне клиента вы должны получить объект json точно так же, как вы указали, что хотите.
еще лучше, вы можете делать разные вещи, в зависимости от того, какое исключение выбрано
}catch(\Exception $ex){ $class = get_class($ex); if($class == 'Symfony\Component\HttpKernel\Exception\HttpException'){ // create a response for HttpException }else{ // create a response for all other Exceptions } }