2014-02-14 72 views
3

我試圖找出如何進行自定義異常行爲。當我把使用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" 
    } 
} 

而且可能做一些額外的事情,如給自己發電子郵件的錯誤。不過,我只希望這樣的事情發生時,我拋出\例外,而不是使用類似

throw new HttpException 

如何做到這一點任何幫助或想法。

我還應該提到,我沒有使用Twig或任何模板。這完全是一個API類型的響應

+0

你能證明你的'嘗試catch'阻止你使用? – Sehael

回答

8

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

另一種解決方案是使用異常監聽器:

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 } 

歡呼

+0

我不使用樹枝爲此我只得到一個請求並返回一個響應。 – Yeak

+0

無論如何你必須有一個異常監聽器。枝條爲你做。另一種方法是創建自定義異常偵聽器,它將輸出帶有JSON內容的http響應。順便說一句你正在使用什麼模板引擎? – sickelap

+0

我沒有使用任何模板引擎,這是更多的API – Yeak

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 
    } 
} 
+0

Nah。太複雜。正如@sickelap建議的那樣,創建你自己的異常監聽器,然後你可以做任何你想做的事情。我正在尋找一本食譜的例子,但沒有看到一個例子。但他們有很多例子。查看HTTPKernel.php以查看請求的處理方式也很有指導意義。 – Cerad