Symfony2 Controller vil ikke fange unntak

stemmer
25

Dette er ruten handler for min slettingen. Det fungerer bra så lenge varen ikke har noen assosiasjoner.

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

Jeg har allerede løst feilen med å prøve å slette et element med assosiasjoner, men gjennom denne prosessen, flush kastet PDOException. Jeg prøvde forskjellige måter å fange den, men det ser ut til å bli fanget inne Symfony2 og da svarer med en HTTP 500 feil. Er det en måte at jeg kan ha Symfony2 ikke ta dette slik at jeg kan klare det? Dette er en XML-respons ved hjelp av AJAX og så jeg vil heller bare sende en feilkode per ovenfor.

Publisert på 16/04/2011 klokken 20:30
kilden bruker
På andre språk...                            


3 svar

stemmer
77

Prøv å endre Exception\Exceptionhvis du ikke er spesifisert PDOExceptionsom Exceptionen bruk uttalelse. PHP prøver å finne \YourNamespaceWithController\Exceptionstedet for \Exception.

Svarte 17/04/2011 kl. 07:21
kilden bruker

stemmer
8

Det er bedre å fange unntaket du virkelig ønsker å fange. I dette eksempelet det er trolig Lære / DBAL / DBALException og / eller Lære / DBA / DBAException.

Og dermed

catch (Doctrine\DBAL\DBALException $e) {
  $result = -1;
};

Jeg anbefaler alle å gjøre noe sånt som:

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

Dette faktisk fanger DB unntak, og hvis noen grunn noen andre unntak occures, dette rethrown tilbake i Symfony2.

Svarte 14/07/2013 kl. 12:07
kilden bruker

stemmer
0

Jeg måtte gjøre følgende som kan hjelpe for noen brukere;

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.    
    }
}
Svarte 27/05/2014 kl. 11:16
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more