Контроллер Symfony2 не поймает исключение - PullRequest
25 голосов
/ 17 апреля 2011

Это обработчик маршрута для моего действия удаления.Это работает хорошо, пока элемент не имеет каких-либо ассоциаций.

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 не ловить это, чтобы я мог справиться с этим?Это XML-ответ с использованием AJAX, поэтому я бы лучше отправил код ошибки, как указано выше.

Ответы [ 3 ]

78 голосов
/ 17 апреля 2011

Попробуйте изменить Exception\Exception, если вы не указали PDOException как Exception в операторе использования.PHP пытается найти \YourNamespaceWithController\Exception вместо \Exception.

9 голосов
/ 14 июля 2013

Лучше поймать исключение, которое вы действительно хотите поймать.В этом примере это, вероятно, 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.

0 голосов
/ 27 мая 2014

Мне пришлось сделать следующее, что могло бы помочь некоторым пользователям;

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