[英]custom exception behavior in symfony2
我试图弄清楚如何制作自定义异常行为。 当我抛出异常时使用
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有足够的信息可以帮助您入门。
简而言之,您应该创建app / 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, $exception->getCode());
$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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.