symfony2中的自定义异常行为

时间:2014-02-14 19:02:51

标签: php symfony exception-handling

我试图弄清楚如何制作自定义异常行为。当我使用

抛出异常时
 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类型响应

2 个答案:

答案 0 :(得分:9)

查看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 }

欢呼声

答案 1 :(得分:0)

如果您希望能够阅读要发回的消息,则需要返回一个响应代码,该代码返回带有响应的文本,例如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
    }
}