2013-01-13 65 views
7

我試圖孤立這個問題(生產它我的應用程序外),但我不能。Laravel 4沒能趕上異常

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

我也試圖與一個catch (Exception $e),同樣的事情發生。

使用此代碼,我得到的第二線DecryptException。這怎麼可能發生,它在try塊?

就像我說的,我試圖做同樣的在一個乾淨的項目,但也有它捕捉到的異常,所以我問在哪裏可以我搞砸的東西了。

+0

可能有不止一個DecryptException類,這是我能想到的唯一的事情。 – dualed

+0

我已經更新了我的問題,因爲我試圖使用「catch(Exception $ e)」,這也不起作用。 –

+0

你能添加實際的錯誤信息嗎? – dualed

回答

24

如果您的應用程序命名空間,你將需要使用

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

同樣,我認爲你正試圖趕上Illuminate\Encryption被命名空間的DecryptException所以你需要

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

記住是Laravel 4仍然是阿爾法pre-beta(顯然他們不確定自己),所以它不是穩定的,可能不是生產的最佳選擇。

+0

+1爲您的答案。在命名空間工作真的讓我感到困惑。有沒有什麼方法可以聲明「使用/」或什麼的?這有點讓人反感,因爲必須反斜線每個全局類。 – Anthony

+0

使用括號語法,您可以在這裏定義'namespace {/ * code here * /}'(在'namespace'關鍵字後面沒有標識符),那麼全局類不會需要一個'\',但是你不能在其中定義一個名稱空間類('class a \ b {}'是無效的)並且你不能嵌套它們,所以它可能不會對你有很大的幫助。對於函數和常量,如果在當前NS中沒有找到,則至少內置一個回退,它將從全局NS加載它們。當然,你總是可以使用Foo,Bar,Baf;(其中'Foo'等是全球空間中的類) – dualed

+0

好吧,很高興知道。感謝您的提示! – Anthony

2

對於laravel 5.1,你應該寫(通常在與其他使用語句文件開頭):

use Illuminate\Contracts\Encryption\DecryptException; 

catch語句之前:

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

編號:https://laravel.com/docs/5.1/encryption - 「解密值下「

可能對他人有所幫助。