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

Fed*_*kun 4 php exception-handling symfony silex

问题

我正在用Silex构建一个小应用程序.它分为REST应用程序和网站.(两个控制器,相同的应用程序).该网站已经安装了自己的自定义错误处理程序,它返回一个用户友好的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
});
Run Code Online (Sandbox Code Playgroud)

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

小智 9

我一直在我的Silex RESTful应用程序中使用以下命令以json格式返回错误:

$app->error(function (\Exception $e, $code) use($app) {
    return $app->json(array("error" => $e->getMessage()),$code);    
});
Run Code Online (Sandbox Code Playgroud)

不确定这是否正确,但它对我有用.

这在Silex网站上有记录:http: //silex.sensiolabs.org/doc/usage.html#error-handlers


Lum*_*dil 2

在 Symfony2 上你可以使用 ExceptionHandler。在异常上,您有堆栈跟踪,因此您可以识别抛出异常的位置。

此外,在 Symfony2 中您可以根据预期的格式进行自定义。它的文档中有很好的解释。

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

有关在何处更改 ExceptionController 的参考

异常控制器API