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

Solutions Collecting From Web of "Контроллер Symfony2 не будет исключать исключение"

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

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

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

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