【问题标题】:Laravel 4 not able to catch ExceptionLaravel 4 无法捕获异常
【发布时间】:2013-01-13 23:03:42
【问题描述】:

我试图隔离这个问题(在我的应用程序之外产生它),但我不能。

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

我也尝试了catch (Exception $e),同样的事情发生了。

使用这段代码,我在第二行得到一个 DecryptException。怎么会这样,在try块里?

就像我说的,我试图在一个干净的项目上做同样的事情,但它发现了异常,所以我问我在哪里搞砸了。

【问题讨论】:

  • DecryptException 类可能不止一个,这是我唯一能想到的。
  • 我已经更新了我的问题,因为我尝试使用“catch (Exception $e)”,但这也没有用。
  • 你能添加实际的错误信息吗?

标签: exception exception-handling laravel


【解决方案1】:

如果您的应用程序是命名空间,则需要使用

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

同样,我认为您尝试捕获的 DecryptException 命名空间位于 Illuminate\Encryption 中,因此您需要

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

请记住 Laravel 4 仍是 alphapre-beta(显然他们自己也不确定),所以它在没有办法稳定,可能不是生产的最佳选择。

【讨论】:

  • +1 为您解答。在命名空间中工作真的让我很困惑。有没有办法只声明“使用/”之类的?不得不反斜杠每个全局类有点烦人..
  • 使用括号语法,您可以定义namespace { /* code here */}namespace 关键字后没有标识符)然后全局类不需要\ ,但您不能定义命名空间里面的类(class a\b {} 无效)并且你不能嵌套它们,所以它可能对你没有多大好处。对于函数和常量,如果在当前 NS 中找不到,则至少内置一个后备,从全局 NS 加载它们。当然你总是可以use Foo, Bar, Baf;(其中Foo等是全局空间中的类)
  • 实际上,您应该提出一个问题,也许其他人知道更好的选择,因为我不是 PHP 如何实现命名空间的忠实粉丝(非常温和地说)并尽量避免使用它们和 PHP现在一般
  • 我有一个 api,它的路由用命名空间分组。相应的类也分别被命名空间,所以我花了很长时间才意识到我需要使用全局命名空间来处理异常 - 如果我想让它们被 api 捕获,我需要使用\Exception
【解决方案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 - 在“解密 A 值”下

可能对其他人有帮助。

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2019-01-14
    • 2010-10-29
    • 1970-01-01
    • 2021-10-09
    相关资源
    最近更新 更多