使用应用程序REST的不同处理程序捕获异常

时间:2013-02-14 10:34:31

标签: php symfony exception-handling silex

问题

我正在使用 Silex 构建一个小应用程序。它分为REST应用程序和网站。 (two controllers,同一个应用)。 该网站已安装其own custom error handler,它返回一个用户友好的html页面。问题是在部分专用REST应用程序中,我应该以某种方式处理异常以返回类型[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
});

问题是,如果从我的控制器中抛出异常,将使用默认错误处理程序。一些技巧? 和Symfony一起?

2 个答案:

答案 0 :(得分:9)

我一直在我的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

答案 1 :(得分:1)

在Symfony2上,您可以使用ExceptionHandler。在Exception中,您有堆栈跟踪,因此您可以识别它被抛出的位置。

此外,在Symfony2中,您可以根据预期的格式进行自定义。很好地解释了in it's documentation

例如,如果将ExceptionController替换为其中一个,则第三个参数显示预期的格式:

Reference on where to change the ExceptionController

ExceptionController API