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

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

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

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

РЕДАКТИРОВАТЬ: я только что узнал, что Laravel использует тот же обработчик исключений, что и Symfony, поэтому я также добавил тег Symfony2.

РЕДАКТИРОВАТЬ 2:

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


person Martijn    schedule 14.10.2013    source источник
comment
Можете ли вы опубликовать более актуальный код (включая блок try)   -  person The Alpha    schedule 16.10.2013


Ответы (3)


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

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

namespace App;

и ты делаешь

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

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

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

Итак, чтобы это работало, вам просто нужен корневой слеш:

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

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

person Antonio Carlos Ribeiro    schedule 17.02.2014
comment
Ух ты!! Так что вы должны помнить, что пространство имен catch (Exception e) не сработает, оно должно быть catch (\Exception e) - person manish; 05.03.2014

По умолчанию файл 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.

person The Alpha    schedule 15.10.2013
comment
Примечание: Laravel продолжит передавать ответственность за обработку ошибки своим зарегистрированным обработчикам, пока один из них не вернет объект Response. Laravel использует шаблон цепочка ответственности при обработке ошибок. Это позволяет вам обрабатывать ошибку любым удобным для вас способом. Вы можете сделать что-то вроде регистрации ошибки Guzzle, а затем позволить другим обработчикам ошибок Laravel решать, как реагировать. См. эту запись в блоге для получения дополнительных пояснений. - person fideloper; 15.10.2013
comment
Это не ответ на вопрос как это обойти? и обрабатывать исключение в моем методе сразу после того, как я вызвал что-то, что может вызвать некоторые исключения. Почему я должен писать код вне своего класса, чтобы обрабатывать вещи, с которыми мой класс умеет обращаться? Взгляните на некоторые примеры Sentry Cartalyst: docs.cartalyst.com/sentry-2/authentication /логин. Это вещи, которые никогда не будут работать на Laravel. - person Antonio Carlos Ribeiro; 15.10.2013
comment
@AntonioCarlosRibeiro, я думал о том, как зарегистрировать собственную обработку ошибок, я ошибаюсь? - person The Alpha; 15.10.2013
comment
Как он/она говорит, но когда я пытаюсь это поймать:. Имо, как видно из кода, он пытается поймать исключение в методе, который не может быть успешным, потому что Laravel перехватывает его раньше всего. - person Antonio Carlos Ribeiro; 15.10.2013
comment
@AntonioCarlosRibeiro, О! теперь я вижу, OP использует try catch в самом классе. - person The Alpha; 15.10.2013
comment
@AntonioCarlosRibeiro вам удалось обойти обработку исключений Laravel, поскольку я также поддерживаю вашу концепцию обработки исключений в самом методе и возврата ответа только оттуда, вместо того, чтобы хранить всю обработку исключений в обычном месте. - person manish; 17.02.2014
comment
Да, я сделал, и просто добавил ответ здесь, чтобы показать, как это сделать. - person Antonio Carlos Ribeiro; 17.02.2014

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

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

использовать это решение

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

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

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

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