2013-01-13 32 views
7

Tôi đã cố gắng cô lập vấn đề này (để sản xuất nó bên ngoài ứng dụng của tôi), nhưng tôi không thể.Laravel 4 không thể bắt ngoại lệ

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

Tôi cũng đã thử với số catch (Exception $e), điều tương tự cũng xảy ra.

Sử dụng mã này, tôi nhận được DecryptException trong dòng thứ hai. Làm thế nào điều này có thể xảy ra, nó nằm trong khối thử?

Giống như tôi đã nói, tôi đã cố gắng làm tương tự trên một dự án sạch sẽ, nhưng ở đó nó đã bắt được ngoại lệ, vì vậy tôi hỏi nơi tôi có thể đã làm rối tung điều gì đó.

+0

Có thể có nhiều hơn một lớp DecryptException, đó là điều duy nhất tôi có thể nghĩ đến. – dualed

+0

Tôi đã cập nhật câu hỏi của mình, vì tôi đã cố gắng sử dụng "catch (Exception $ e)" và điều này cũng không hoạt động. –

+0

bạn có thể thêm thông báo lỗi thực tế không? – dualed

Trả lời

24

Nếu ứng dụng của bạn được namespaced, bạn sẽ cần phải sử dụng

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

tương tự như vậy, tôi nghĩ rằng DecryptException bạn đang cố gắng để bắt được namespaced trong Illuminate\Encryption vì vậy bạn cần

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

Lưu ý rằng Laravel 4 vẫn là alpha hoặc pre-beta (rõ ràng là họ không chắc chắn), vì vậy nó là không có cách nào ổn định và có lẽ không phải là sự lựa chọn tốt nhất cho sản xuất.

+0

+1 cho câu trả lời của bạn. Làm việc trong một không gian tên thực sự làm tôi rối tung lên. Có cách nào để chỉ tuyên bố "sử dụng /" hoặc một cái gì đó? Thật khó chịu khi phải gạch chéo mọi lớp toàn cầu .. – Anthony

+0

Với khung-cú pháp bạn có thể định nghĩa 'không gian tên {/ * mã ở đây * /}' (không có một từ định danh sau từ khóa 'namespace') thì các lớp chung không cần một '\', nhưng bạn không thể định nghĩa một lớp tên trong nó ('class a \ b {}' không hợp lệ) và bạn không thể lồng chúng, vì vậy nó có thể sẽ không làm bạn tốt. Đối với các hàm và hằng số ít nhất một dự phòng được xây dựng để tải chúng từ NS toàn cầu nếu không tìm thấy trong NS hiện tại. Tất nhiên bạn luôn có thể sử dụng Foo, Bar, Baf; '(trong đó' Foo', vv là các lớp trong không gian toàn cầu) – dualed

+0

Ok, tốt để biết. Cảm ơn vì những lời khuyên! – Anthony

2

Đối laravel 5.1 bạn nên viết (nói chung là lúc bắt đầu của tập tin với báo cáo sử dụng khác):

use Illuminate\Contracts\Encryption\DecryptException; 

Trước khi lệnh catch:

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

Ref: https://laravel.com/docs/5.1/encryption - dưới "giải mã giá trị gia tăng "

Có thể hữu ích cho người khác.

Các vấn đề liên quan