2011-04-16 18 views
24

Este es el controlador de ruta para mi acción de eliminación. Funciona bien siempre que el elemento no tenga ninguna asociación.El controlador Symfony2 no detectará la excepción

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

que ya han solucionado el error de tratar de eliminar un elemento con las asociaciones, sino a través de este proceso, el "flush" fue lanzando PDOException. Intenté varias formas de atraparlo, pero parece quedar atrapado dentro de Symfony2 y luego responde con un error HTTP 500. ¿Hay alguna manera de que Symfony2 no pueda detectar esto para poder manejarlo? Esta es una respuesta XML utilizando AJAX, por lo que preferiría simplemente enviar un código de error por encima.

Respuesta

76

Intente cambiar Exception → si no ha especificado PDOException como Exception en una declaración de uso. PHP intenta encontrar \YourNamespaceWithController\Exception en lugar de \Exception.

+1

Gracias! Eso fue todo. – sleeves

+0

¡Yo también, lo aprecio! –

8

Es mejor detectar la excepción que realmente desea capturar. En este ejemplo, probablemente sea Doctrine/DBAL/DBALException y/o Doctrine/DBA/DBAException.

Así

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

Lo recomiendo hacer algo como:

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

En realidad, esto atrapa las excepciones DB, y si por alguna razón occures alguna otra excepción, esto se relanza de nuevo en Symfony2.

1

Tuve que hacer lo siguiente que podría ayudar a algunos usuarios;

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