2013-10-14 3 views
7

Ho un metodo che controlla se un utente ha informazioni di sessione valide. Questo dovrebbe lancerà un'eccezione, Guzzle\Http\Exception\BadResponseException ma quando provo a prenderlo:Come bypassare Laravel Gestione delle eccezioni

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

laravel non arrivare a questo codice e immediatamente inizia un proprio la gestione degli errori. E idee su come bypassare l'implementazione di Laravels e utilizzare il mio Catch.

EDIT: Ho appena scoperto che Laravel utilizza lo stesso gestore di eccezioni di Symfony, quindi ho aggiunto anche il tag Symfony2.

EDIT 2:

I sorta di risolto il problema disattivando Guzzle eccezioni e controllando il collettore di ritorno manualmente. È un po 'una scorciatoia ma in questo caso fa il lavoro. Grazie per le risposte!

+0

potete inserire codice più rilevante (tra cui 'blocco try') –

risposta

9

In realtà questa eccezione può essere catturato in laravel, devi solo rispettare (e capire) namespacing:

Se hai

namespace App; 

e fate

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

PHP capisce che stai provando a

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

Quindi, per farlo funzionare basta una barra radice:

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

e funzionerà.

+0

Ripensandoci hai perfettamente ragione! – Martijn

+1

Wow !! Quindi dovresti prendere in considerazione la cattura dei nomi (Eccezione e) non funzionerà dovrebbe essere catturata (\ Eccezione e) – manish

2

Per impostazione predefinita, il file app/start/global.php contiene un gestore errori per tutte le eccezioni. Tuttavia, è possibile specificare più gestori se necessario. I gestori vengono chiamati in base allo type-hint dell'eccezione gestita. Ad esempio, è possibile creare un gestore che gestisce solo i tuoi BadResponseException casi, come

App::error(function(Guzzle\Http\Exception\BadResponseException $exception) 
{ 
    // Handle the exception... 
    return Response::make('Error! ' . $exception->getCode()); 
}); 

Inoltre, assicurarsi di avere un (BadResponseException) classe ben definita. Maggiori informazioni su Laravel Documentation.

+2

** Nota: ** che laravel continuerà a passare la responsabilità di gestire l'errore ai suoi gestori registrati fino a quando si ritorna un oggetto' Response' . Laravel utilizza la [Chain of Responsibility] (http: // en.wikipedia.org/wiki/Chain-of-responsibility_pattern) modello durante la gestione degli errori. Questo ti consente di gestire l'errore in qualsiasi modo tu scelga. Puoi fare qualcosa come registrare l'errore Guzzle, e poi lasciare che gli altri gestori di errori di Laravel decidano come rispondere. Vedere [questo post del blog] (http://fideloper.com/laravel4-errorhandling "laravel error handling") per ulteriori spiegazioni. – fideloper

+2

Questa non è una risposta a "come bypassarlo?" e gestisco l'eccezione nel mio metodo subito dopo aver chiamato qualcosa che potrebbe generare alcune eccezioni. Perché dovrei scrivere codice al di fuori della mia classe per gestire cose che la mia classe sa come gestire? Dai un'occhiata ad alcuni esempi di Sentry's Cartalyst: http://docs.cartalyst.com/sentry-2/authentication/login. Sono cose che non funzioneranno mai su Laravel. –

+0

@AntonioCarlosRibeiro, la domanda che ho pensato su come registrare la tua gestione degli errori, mi sbaglio? –

2

Invece del codice

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

utilizzare questa soluzione

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

per catturare tutte le possibili eccezioni generate dal Guzzle.

Se esplicitamente volete prendere un BadResponseException è anche possibile anteporre namespace classe del eccezione con '\'.

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