Symfony2 Controller不会捕获异常

sle*_*ves 25 php symfony doctrine-orm

这是我删除操作的路由处理程序.只要该项目没有任何关联,它就能很好地工作.

public function projectDeleteAction()
{
    try {
        $request = $this->get('request');
        $my_id = $request->query->get('id');

        $em = $this->get('doctrine.orm.entity_manager');

        $item = $em->find('MyBundle:Main', $my_id);

        $em->remove($item);
        $em->flush();

        $info = $item->getName();
        $result = 0;
    }
    catch (Exception $e) {
        $info = toString($e);
        $result = -1;
    }

    return $this->render('MyBundle:Main:response.xml.twig',
            array('info' => $info, 'result' => $result ));
}
Run Code Online (Sandbox Code Playgroud)

我已经解决了尝试删除带关联的项的错误,但是通过这个过程,"flush"抛出了PDOException.我尝试了各种方法来捕获它,但它似乎被Symfony2内部捕获,然后它响应HTTP 500错误.有没有办法我可以让Symfony2没有抓住这个,以便我可以处理它?这是一个使用AJAX的XML响应,所以我宁愿只发送一个错误代码.

Jos*_*ech 78

如果未在use语句中指定,请尝试更改Exception→ .PHP试图找到而不是.\ExceptionPDOExceptionException\YourNamespaceWithController\Exception\Exception


Rud*_*sma 9

最好抓住你真正想要捕获的异常.在此示例中,可能是Doctrine/DBAL/DBALException和/或Doctrine/DBA/DBAException.

从而

catch (Doctrine\DBAL\DBALException $e) {
  $result = -1;
};
Run Code Online (Sandbox Code Playgroud)

我会建议做类似的事情:

    } catch (\Exception $e) {
        switch (get_class($e)) {
            case 'Doctrine\DBAL\DBALException':
                echo "DBAL Exception<br />";
                break;
            case 'Doctrine\DBA\DBAException':
                echo "DBA Exception<br />";
                break;
            default:
                throw $e;
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这实际上捕获了数据库异常,并且如果由于某种原因发生了一些其他异常,则将其重新引入Symfony2.