2012-05-16 15 views
17

staram się rzucać wyjątki i robię, co następuje:Symfony2 i wyjątek rzucanie błąd

use Symfony\Component\HttpKernel\Exception\HttpNotFoundException; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 

jestem następnie stosując je w następujący sposób:

throw new HttpNotFoundException("Page not found"); 
    throw $this->createNotFoundException('The product does not exist'); 

jednak otrzymuję błędów takich jak Wyjątek HttpNotFoundException nie został znaleziony itp.

Czy to najlepszy sposób na wyrzucanie wyjątków?

+1

To normalne, aby rzucić je jako pierwszy przykład throw new Exception ('Wiadomość'); Dopóki zaimportowałeś klasę wyjątku, tak jak się wydaje, używając instrukcji use, powinna ona działać. Prawdopodobnie więcej na to, że się nie wyświetlasz - czy możesz opublikować rzeczywiste nagłówki klas i ślad stosu wyjątków? – PorridgeBear

+0

Wystąpił błąd: Błąd krytyczny: nie znaleziono klasy "Rest \ UserBundle \ Controller \ HttpNotFoundException" w /Users/jinni/Sites/symfony.com/src/Rest/UserBundle/Controller/DefaultController.php – jini

+0

Dołączyłem użycie Symfony \ Component \ HttpKernel \ Wyjątek na górze – jini

Odpowiedz

45

Spróbuj:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

i

throw new NotFoundHttpException("Page not found"); 

Chyba masz go nieco do tyłu :-)

+0

dzięki Chris ... – jini

+0

dzięki @Chris, działał jak czar – Stevanicus

+0

To nie wysyła statusu 404 – Volatil3

9

Jeśli jej w sterowniku, można zrobić to w ten sposób:

throw $this->createNotFoundException('Unable to find entity.'); 
25

w dowolnej konfiguracji ler można to wykorzystać dla odpowiedzi 404 HTTP wewnątrz Symfony

throw $this->createNotFoundException('Sorry not existing'); 

sam jak

throw new NotFoundHttpException('Sorry not existing!'); 

czy to dla 500 kod odpowiedzi HTTP

throw $this->createException('Something went wrong'); 

samo jak

throw new \Exception('Something went wrong!'); 

lub

//in your controller 
$response = new Response(); 
$response->setStatusCode(500); 
return $response; 

czy to jest dla każdego typu błędów

throw new Symfony\Component\HttpKernel\Exception\HttpException(500, "Some description"); 

również ... Dla niestandardowej Exceptionyou can flow this URL

+1

lepiej .. nuff powiedział. – JohnnyQ

+2

@ hassan-magdy, Nie mogę znaleźć metody "createException (...)" w symfony 2.3, 2.7 lub 3.0 w dowolnej klasie. Jesteś pewien, że to działa? –

+0

@NunoPereira Najlepszym rozwiązaniem powinno być wyrzucenie nowego [wyjątku HTTPException] (http://api.symfony.com/3.2/Symfony/Component/HttpKernel/Exception/HttpException.html#method___construct), jak opisano w poprzednim przykładzie powyżej. – sentenza

0

w kontrolerze, można po prostu do:

public function someAction() 
{ 
    // ... 

    // Tested, and the user does not have permissions 
    throw $this->createAccessDeniedException("You don't have access to this page!"); 

    // or tested and didn't found the product 
    throw $this->createNotFoundException('The product does not exist'); 

    // ... 
} 

W tej sytuacji nie ma potrzeby dodawania u góry numeru use Symfony\Component\HttpKernel\Exception\HttpNotFoundException;. Powodem tego jest to, że nie używasz bezpośrednio klasy, tak jak przy użyciu konstruktora.

Poza kontrolerem, należy wskazać, gdzie można znaleźć klasę, i wyrzucić wyjątek, jak zwykle.Tak:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

// ... 

// Something is missing 
throw new HttpNotFoundException('The product does not exist'); 

lub

use Symfony\Component\Security\Core\Exception\AccessDeniedException; 

// ... 

// Permissions were denied 
throw new AccessDeniedException("You don't have access to this page!"); 
Powiązane problemy