加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – 在Laravel / Lumen中,为什么catch块没有捕获我的异常?

发布时间:2020-12-14 19:34:54 所属栏目:大数据 来源:网络整理
导读:在Laravel / Lumen PHP框架中捕获异常的最佳方法是什么?这很可能是一般适用于PHP的问题. 目前,我有一个UsersController,它在我的User类中调用(在try块中)’findByUsernameOrFail’方法.如果找不到用户名,则此方法将抛出异常,但catch块未捕获异常!为什么?
在Laravel / Lumen PHP框架中捕获异常的最佳方法是什么?这很可能是一般适用于PHP的问题.

目前,我有一个UsersController,它在我的User类中调用(在try块中)’findByUsernameOrFail’方法.如果找不到用户名,则此方法将抛出异常,但catch块未捕获异常!为什么?

class UsersController extends Controller {

    public function show($username)
    {
        try
        {
            $user = AppUser::findByUsernameOrFail($username);

            return $user;
        }
        catch(Exception $e)
        {
            // This doesn't work. This code is never called because Laravel 
            return $this->setStatusCode(404)->respondWithError('Username Not Found!');
        }
    }

此UsersController中的“show”方法在User模型中调用名为“findByUsernameOrFail”的方法.如果它通过用户名找到用户,则返回找到的$user对象.如果它没有通过用户名找到用户,则会抛出异常.但是,出于某种原因,此异常未被捕获,而Laravel正在生成一般错误页面.

这是我的用户模型中的一些代码:

class User extends IlluminateDatabaseEloquentModel {

    public static function findByUsernameOrFail($username)
    {
        if ( ! is_null($user = static::whereUsername($username)->first()))
        {
            return $user;
        }

        throw new IlluminateDatabaseEloquentModelNotFoundException;
    }
}

这是我尝试运行时会发生什么的屏幕截图:

enter image description here

为什么我的代码的“捕获”部分从未执行过!?我想要发生的是我的应用程序优雅地返回HTTP 404错误,该错误表明无法找到用户!基于我对Try / Catch和Exceptions的了解,我的代码应该可行,但显然我遗漏了一些东西.

如何让此代码返回此代码所预期的HTTP 404错误消息?

解决方法

如建议的那样,您可能需要明确声明您正在侦听的异常.所以正确的方式是

catch (IlluminateDatabaseEloquentModelNotFoundException $e) {
     // do your stuff.
}

但是在Laravel你可以超越这个并使它非常抽象(就像Laravel中的几乎所有东西一样)

如果在render方法中打开app / Exceptions / Handler.php,您可以监听整个应用程序中抛出的各种异常.

所以对于你的特殊情况,它可能如下:

if ($e instanceof ModelNotFoundException) {
    abort(404);
}

(别忘了在顶部导入完整路径)

正如@Phroggyy所提到的,您可以使用Laravel的findOrFail()方法内联您的代码.在幕后,它将完全按照您手动执行的操作 – 尝试查找模型并在未找到时抛出异常.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读