Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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