2013-01-13 12 views
7

Ho cercato di isolare questo problema (per produrlo fuori dalla mia app), ma non posso.Laravel 4 non in grado di catturare Eccezione

try { 
    $has_cache = Cache::has($cache_key); 
} 
catch (DecryptException $e) { 
    echo "No biggie"; 
    exit; 
} 

Ho anche provato con una catch (Exception $e), la stessa cosa succede.

Utilizzando questo codice, ottengo un DecryptException nella seconda riga. Come può accadere, è nel blocco try?

Come ho detto, ho provato a fare lo stesso su un progetto pulito, ma ci sono state delle eccezioni, quindi sto chiedendo dove avrei potuto incasinare qualcosa.

+0

Ci possono essere più di una classe DecryptException, è l'unica cosa che riesco a pensare. – dualed

+0

Ho aggiornato la mia domanda, poiché ho provato a utilizzare "catch (Exception $ e)" e anche questo non ha funzionato. –

+0

potresti aggiungere il messaggio di errore attuale? – dualed

risposta

24

Se l'applicazione è namespace, si avrebbe bisogno di utilizzare

catch(\Exception $e); 
// or preferably 
catch(\RuntimeException $e); 

allo stesso modo, credo che il DecryptException che si sta tentando di recuperare è namespace in Illuminate\Encryption così avresti bisogno

catch(\Illuminate\Encryption\DecryptException) 
// or use "use" somewhere before the try/catch 
use \Illuminate\Encryption\DecryptException 

Ricordare che Laravel 4 è ancora alpha o pre-beta (apparentemente non sono sicuri di sé), quindi non è in alcun modo stabile e probabilmente non è la scelta migliore per la produzione.

+0

+1 per la tua risposta. Lavorare in uno spazio dei nomi mi fa davvero scherzare. C'è un modo per dichiarare solo "usi /" o qualcosa del genere? È piuttosto irritante dover rovesciare ogni classe globale. – Anthony

+0

Con la parentesi quadra puoi definire il 'namespace {/ * code qui * /}' (senza un identificatore dopo la parola chiave 'namespace') quindi le classi globali non ho bisogno di un '\', ma non puoi definire una classe con namespace ('class a \ b {}' non è valida) e non puoi nidificarli, quindi probabilmente non ti farà molto bene. Per funzioni e costanti viene costruito almeno un fallback che li carica dal NS globale se non trovato nell'attuale NS. Ovviamente puoi sempre usare Foo, Bar, Baf; '(dove' Foo', ecc. Sono classi nello spazio globale) – dualed

+0

Ok, buono a sapersi. Grazie per i suggerimenti! – Anthony

2

Per laravel 5.1 si dovrebbe scrivere (in genere all'inizio del file con altre dichiarazioni di uso):

use Illuminate\Contracts\Encryption\DecryptException; 

Prima istruzione catch:

try { 
    $data = \Crypt::decrypt($key); 
} catch (DecryptException $e) { 
    echo 'caught exception'; 
    exit(); 
} 

Rif: https://laravel.com/docs/5.1/encryption - alla voce "Decifrare un valore "

Potrebbe essere utile per gli altri.