关于Laravel 5.5-5.6版本的异常处理(HttpNotFound示例)

本周要实现404页面的逻辑之前项目中的404页面都是静态数据,所以翻阅了一下Laravel文档及课外知识查到其中一些端倪。

在Laravel中 默认已经为我们配置好了错误和异常处理,我们在App\Exceptions\Handler 类中触发异常并将响应返回给用户

异常处理器

所有异常都由类 App\Exceptions\Handler 处理,该类包含两个方法:report 和 render。

report()

这个方法可以记录引发的异常或者将它们解析到错误日志引擎(如 bugsnag 或者 sentry),这里不讨论。

render 方法

render 方法负责将给定异常转化为发送给浏览器的 HTTP 响应,默认情况下,异常被传递给为你生成响应的基类。当然,你也可以按照自己的需要检查异常类型或者返回自定义响应


当前面不存在时,Laravel会抛出一个HttpNotFoundException

下面是我的代码

        if($this->isHttpException($exception)){
            if($exception->getStatusCode() == 404){
                return response()->view('errors.404', ['message'=>'页面404'], $exception->getStatusCode());
            }
        }
        
        return parent::render($request, $exception);

然后就产生了一个奇怪的问题,有些页面的404并没有按照这个逻辑去走,于是开始刨根问底.

QQ截图20180902215013.png

原来有些页面用了findOrFail()这个方法 导致异常为ModelNotFoundException 所以

$this->isHttpException($exception)

无法俘获到该异常.
我们只需要在调用isHttpException前 通过prepareException()方法 对异常进行处理一下

$e = $this->prepareException($exception);
        if($this->isHttpException($e) && ($e->getStatusCode() == 404)){
            return response()->view('errors.404',[],404);
        }

这样就可以正常俘获到HttpNotFound啦.

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容