2012-05-16 42 views
17

Tôi cố gắng để ném ngoại lệ và tôi đang làm như sau:symfony2 và ném ngoại lệ lỗi

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

tôi sau đó sử dụng chúng theo cách sau:

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

Tuy nhiên tôi nhận được lỗi như Không tìm thấy HttpNotFoundException, v.v.

Đây có phải là cách tốt nhất để ném ngoại lệ không?

+1

Đó là bình thường để ném chúng như ví dụ đầu tiên của bạn, ném ngoại lệ mới ('Message'); Vì vậy, miễn là bạn đã nhập khẩu các lớp học ngoại lệ như bạn dường như đã làm với một tuyên bố sử dụng nó nên làm việc. Có thể nhiều hơn nữa mà bạn không hiển thị - bạn có thể đăng các tiêu đề lớp thực tế và dấu vết ngăn xếp ngoại lệ không? – PorridgeBear

+0

lỗi tôi nhận được là: Lỗi nghiêm trọng: Class 'Rest \ UserBundle \ Controller \ HttpNotFoundException' không tìm thấy trong /Users/jinni/Sites/symfony.com/src/Rest/UserBundle/Controller/DefaultController.php – jini

+0

Tôi đã bao gồm sử dụng Symfony \ Thành phần \ HttpKernel \ Ngoại lệ ở đầu – jini

Trả lời

45

Hãy thử:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

throw new NotFoundHttpException("Page not found"); 

Tôi nghĩ rằng bạn đã nhận nó một chút về phía sau :-)

+0

nhờ Chris ... – jini

+0

cảm ơn @Chris, đã làm việc như một nét duyên dáng – Stevanicus

+0

Nó không gửi trạng thái 404 – Volatil3

9

Nếu nó ở một bộ điều khiển, bạn có thể làm theo cách này:

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

trong mọi kiểm soát ler bạn có thể sử dụng cho 404 HTTP phản ứng bên trong Symfony

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

giống như

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

hay này cho 500 mã phản hồi HTTP

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

giống như

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

hoặc

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

hoặc này là dành cho bất kỳ loại lỗi

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

Ngoài ra ... Đối với Tuỳ chỉnh ngoại lệyou can flow this URL

+1

tốt hơn .. nuff nói. – JohnnyQ

+2

@ hassan-magdy, tôi không thể tìm thấy phương thức "createException (...)" trong symfony 2.3, 2.7 hoặc 3.0 trong bất kỳ lớp nào. Bạn có chắc chắn rằng nó hoạt động? –

+0

@NunoPereira Giải pháp tốt nhất nên đưa ra một [HTTPException] mới (http://api.symfony.com/3.2/Symfony/Component/HttpKernel/Exception/HttpException.html#method___construct), như được mô tả trong ví dụ trên. – sentenza

0

Trong bộ điều khiển, bạn có thể đơn giản làm:

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

    // ... 
} 

Trong trường hợp này, không cần phải bao gồm use Symfony\Component\HttpKernel\Exception\HttpNotFoundException; ở trên cùng. Lý do là bạn không sử dụng trực tiếp lớp, như sử dụng hàm tạo.

Bên ngoài bộ điều khiển, bạn phải chỉ rõ nơi có thể tìm thấy lớp và ném ngoại lệ như bình thường.Như thế này:

use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

// ... 

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

hoặc

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

// ... 

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