2010-12-19 19 views
12

Tengo un código como continuacióntry catch no atrapa la excepción?

try { 
    $user = $query->getSingleResult(); 
} catch (Doctrine\ORM\NoResultException $e) { 
    return null; 
} catch (Exception $e) { 
    return null; 
} 

getSingleResult() lanzará NoResultException si no se encuentran filas. y parece que todavía recibo la excepción ... la captura no parece funcionar. ¿porqué es eso?

Respuesta

34

Si se namespaced su código, trate de usar:

catch (\Doctrine\ORM\NoResultException $e) 

Nota de la barra invertida delante del espacio de nombres Doctrina.

La razón por la que necesita hacer esto es porque los espacios de nombres de PHP son relativos, en lugar de absolutos.

Si su código está en el espacio de nombres a My\Namespace, e intenta capturar Doctrine\ORM\NoResultException, en realidad trata de atrapar My\Namespace\Doctrine\ORM\NoResultException.

anteponiendo el espacio de nombres con un \ Haces que absoluta (similar a los nombres de ruta Unix)

+0

Esto es más probable porque el usuario está utilizando Doctrine 2, que _is_ namespaced. – lotsoffreetime

+0

Sin embargo, el uso de Doctrine 2 no le obliga a crear un espacio de nombre para su propio código. En un caso donde no ha especificado un espacio de nombre para su código, siempre se supone que el espacio de nombres está en la raíz, en cuyo caso no necesitaría la \ –

+0

inicial. También puede simplemente hacer una captura de 'NoResultException' y agregue un 'use Doctrine \ ORM \ NoResultException;' en su encabezado de archivo. –

2

También es posible añadir un

use Exception; 

En la parte superior de la clase y va a resolver la excepción nombre de clase utilizado en el bloque try/catch.