Контроллер Symfony2 не поймает исключение

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

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


person sleeves    schedule 16.04.2011    source источник


Ответы (3)


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

person Josef Cech    schedule 17.04.2011
comment
Я тоже, ценю! - person Shane N; 13.10.2015

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

person Rudy Broersma    schedule 14.07.2013

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

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.    
    }
}
person Jurgen    schedule 27.05.2014