2013-01-13 10 views
7

Próbowałem wyizolować ten problem (aby wyprodukować go poza moją aplikacją), ale nie mogę.Laravel 4 nie jest w stanie złapać wyjątku

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

Próbowałem również z catch (Exception $e), to samo się dzieje.

Za pomocą tego kodu otrzymuję wyjątek DecryptException w drugim wierszu. Jak to się dzieje, jest w bloku try?

Tak jak powiedziałem, starałem się zrobić to samo na czystym projekcie, ale tam dostrzegłem wyjątek, więc pytam, gdzie mogłem coś zepsuć.

+0

Może być więcej niż jedna klasa DecryptException, to jedyna rzecz, o której mogę pomyśleć. – dualed

+0

Zaktualizowałem moje pytanie, ponieważ próbowałem użyć "catch (Exception $ e)", co również nie zadziałało. –

+0

Czy mógłbyś dodać aktualny komunikat o błędzie? – dualed

Odpowiedz

24

Jeśli aplikacja jest przestrzeni nazw, trzeba by użyć

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

podobnie, myślę, że DecryptException próbujesz złapać się w przestrzeni nazw Illuminate\Encryption więc należałoby

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

Należy pamiętać, że, że Laravel 4 nadal jest alfa lub pre-beta (podobno nie są pewni siebie), więc nie jest w żaden sposób stabilny i prawdopodobnie nie jest najlepszym wyborem do produkcji.

+0

+1 za odpowiedź. Praca w przestrzeni nazw naprawdę mnie psuje. Czy istnieje sposób, aby po prostu zadeklarować "uses /" lub coś takiego? To irytujące, że musimy cofnąć wszystkie globalne klasy. – Anthony

+0

Przy użyciu składni nawiasów można zdefiniować 'namespace {/ * code here * /}' (bez identyfikatora po słowie kluczowym 'namespace'), a następnie klasy globalne nie potrzebuję '\', ale nie możesz zdefiniować w nim klasy o nazwie namespaced ('class a \ b {}' is not valid) i nie możesz ich zagnieździć, więc prawdopodobnie nie zrobi ci wiele dobrego. Dla funkcji i stałych wbudowany jest co najmniej fallback, który ładuje je z globalnego NS, jeśli nie został znaleziony w bieżącym NS. Oczywiście zawsze możesz "używać Foo, Bar, Baf;" (gdzie 'Foo' itp. Są klasami w przestrzeni globalnej) – dualed

+0

Dobrze, dobrze wiedzieć. Dzięki za porady! – Anthony

2

Dla laravel 5.1 należy napisać (zwykle na początku pliku z innych sprawozdań Korzystanie):

use Illuminate\Contracts\Encryption\DecryptException; 

przed instrukcją haczyk:

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

Ref: https://laravel.com/docs/5.1/encryption - pod „Odszyfrowanie wartości "

Może być pomocny dla innych.