Как обойти обработку исключений Laravel


У меня есть метод, который проверяет, есть ли у пользователя допустимая информация о сеансе. Предполагается, что это вызовет исключение, GuzzleHttpExceptionBadResponseException но когда я пытаюсь поймать его:

catch (GuzzleHttpExceptionBadResponseException $e) 
{
    return false;
} 
return true

Laravel не добирается до этого кода и немедленно начинает его собственную обработку ошибок. И идеи о том, как обойти собственную реализацию Laravels и использовать свой собственный улов.

EDIT: я только что узнал, что Laravel использует тот же обработчик исключений, что и Symfony, поэтому я также добавил тег Symfony2.

Правка 2:

Я вроде как исправил проблема заключается в отключении исключений Guzzle и проверке заголовка возврата вручную. Это немного короткий путь, но в данном случае он делает свою работу. Спасибо за ответы!

3 7

3 ответа:

На самом деле это исключение может быть поймано в Laravel, вы просто должны уважать (и понимать) пространство имен:

Если у вас есть

namespace App;

И вы делаете

catch (Guzzle\Http\Exception\BadResponseException $e) 

PHP понимает, что вы пытаетесь

catch (\App\Guzzle\Http\Exception\BadResponseException $e) 

Итак, для его работы вам просто нужна косая черта корня:

catch (\Guzzle\Http\Exception\BadResponseException $e) 

И это сработает.

По умолчанию файл app/start/global.php содержит обработчик ошибок для всех исключений. Однако при необходимости можно указать дополнительные обработчики. Обработчики вызываются на основе type-hint обрабатываемого ими исключения. Например, вы можете создать обработчик, который обрабатывает только ваши экземпляры BadResponseException, например

App::error(function(Guzzle\Http\Exception\BadResponseException $exception)
{
    // Handle the exception...
    return Response::make('Error! ' . $exception->getCode());
});
Кроме того, убедитесь, что у вас есть хорошо определенный (BadResponseException) класс. Подробнее читайте наLaravel Documentation .

Вместо вашего кода

catch (Guzzle\Http\Exception\BadResponseException $e) 
{
   return false;
} 
return true

Используйте это решение

catch (\Exception $e) 
{
   return false;
} 
return true

Чтобы поймать все возможные исключения, брошенные жадностью.

Если вы явно хотите поймать BadResponseException , вы также можете добавить пространство имен класса вашего исключения с помощью '\'.

catch (\Guzzle\Http\Exception\BadResponseException $e) 
{
   return false;
} 
return true