2010-12-19 12 views
12

mam kod jak poniżejSpróbuj catch nie łapie wyjątku?

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

getSingleResult() rzuci NoResultException jeśli nie zostaną znalezione żadne wiersze. i wygląda na to, że wciąż mam wyjątek ... haczyk nie działa. dlaczego?

Odpowiedz

34

Jeśli kod jest przestrzeni nazw, spróbuj:

catch (\Doctrine\ORM\NoResultException $e) 

zanotować ukośnik w przedniej części przestrzeni nazw doktryny.

Powodem tego jest to, że przestrzenie nazw PHP są względne, a nie bezwzględne.

Jeśli twój kod jest pseudonimem pod numerem My\Namespace, a Ty próbujesz złapać Doctrine\ORM\NoResultException, w rzeczywistości próbuje złapać My\Namespace\Doctrine\ORM\NoResultException.

poprzedzając nazw z \ zrobić to absolutny (podobny do ścieżek UNIX)

+0

Jest to najprawdopodobniej dlatego, że użytkownik używa Doctrine 2, który _jest_ nazwanypacem. – lotsoffreetime

+0

Używanie Doctrine 2 nie wymusza jednak na przestrzeni nazw własnego kodu. W przypadku, gdy nie określiłeś przestrzeni nazw dla twojego kodu, przestrzeń nazw jest zawsze uważana za root, w takim przypadku nie będziesz potrzebował początkowego \ –

+0

Możesz równie dobrze zrobić haczyk 'NoResultException' i dodaj 'use Doctrine \ ORM \ NoResultException;' w nagłówku pliku. –

2

Jest również możliwe dodanie

use Exception; 

Na szczycie klasy i będzie rozwiązać Exception nazwa klasy używana w bloku try/catch.

Powiązane problemy