26

这是我的删除操作的路由处理程序。只要该项目没有任何关联,它就可以正常工作。

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 ));
}

我已经解决了尝试删除具有关联的项目的错误,但是通过这个过程,“刷新”正在抛出 PDOException。我尝试了各种方法来捕获它,但它似乎在 Symfony2 中被捕获,然后它响应 HTTP 500 错误。有没有办法让 Symfony2 无法捕捉到它以便我处理它?这是一个使用 AJAX 的 XML 响应,所以我宁愿只发送上面的错误代码。

4

3 回答 3

78

如果您没有在 use 语句中指定为,请尝试更改Exception→ 。PHP 尝试查找而不是(并且它不检查此类异常的存在)。\ExceptionPDOExceptionException\YourNamespaceWithController\Exception\Exception

于 2011-04-17T07:21:53.173 回答
9

最好捕获您真正想要捕获的异常。在这个例子中,这可能是 Doctrine/DBAL/DBALException 和/或 Doctrine/DBA/DBAException。

因此

catch (Doctrine\DBAL\DBALException $e) {
  $result = -1;
};

我建议做类似的事情:

    } 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;
        }
    }

这实际上捕获了数据库异常,如果由于某种原因发生了其他异常,则将其重新抛出回 Symfony2。

于 2013-07-14T12:07:57.843 回答
0

我必须执行以下操作,这可能对某些用户有所帮助;

try{
    $this->doctrine->em->persist($user);
    $this->doctrine->em->flush();
}catch(Exception $e){
    if($e->getPrevious()->getCode() == 23505){
        //handle duplicate error, 23505 is for postgres, 23000 is mysql unique constraint.    
    }
}
于 2014-05-27T11:16:14.147 回答