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

これは実際に DB 例外をキャッチし、何らかの理由で他の例外が発生した場合、これは 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 に答える