Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 552|回复: 0

Laravel 5.1 中的异常处理器和HTTP异常处理 abort()

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-17 05:37:54 | 显示全部楼层 |阅读模式

    错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题。

    Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理。

    1、配置

    我们可以在config/app.php文件中通过debug配置项来决定是否开启调试模式,其默认配置如下:

    'debug' => env('APP_DEBUG', false),

    当然真正的配置位于项目根目录下的.env文件,如果其值为true,则如果程序抛出异常会在页面中显示错误异常信息。

    2、异常处理器

    Laravel应用中所有的异常都通过App\Exceptions\Handler进行处理,下面我们先简单分析下给异常处理器类的属性和方法:

    $dontReport属性

    protected $dontReport = [
        HttpException::class,
        ModelNotFoundException::class,
    ];

    $dontReport属性定义了不会被记录到日志的异常,比如默认HTTP异常和ModelNotFound异常都不会记录下来,而是直接在浏览器中打印异常信息。

    report方法

    public function report(Exception $e)
    {
        return parent::report($e);
    }

    report方法会调用父级的report方法将异常信息记录到日志中(关于日志我们将在下一节讲)。

    render方法

    public function render($request, Exception $e)
    {
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }
    
        return parent::render($request, $e);
    }
    

    render方法会将异常信息渲染到HTTP响应中,从而让我们在开发过程中直观地浏览器中查看错误信息以便找到问题所在。

    简单测试示例

    下面我们来简单测试下ModelNotFoundException,顾名思义,在使用Eloquent ORM进行查询时对应模型实例在数据库中没有找到会抛出该异常。

    我们照例在TestController的index方法中编写测试代码如下:

    $user = User::findOrFail(100);
    dd($user);

    然后在浏览器中访问http://laravel.app:8000/test,页面会打印出错误信息:

    ModelNotFoundException

    由于ModelNotFoundException$dontReport属性数组中,因而不会记录到日志中(NotFoundHttpExceptionHttpException的子类,所以也不会被记录到日志),接下来我们测试如下代码:

    $num = 1/0;

    再次访问http://laravel.app:8000/test,同样,页面会打印错误信息:

    Laravel ErrorException

    除此之外,在错误日志storage/logs/laravel.log中也能看到写入进来的错误信息:

    [2015-11-08 21:21:47] local.ERROR: exception 'ErrorException' with message 'Division by zero' in /vagrant/laravelapp/app/Http/Controllers/TestController.php:389
    Stack trace:
    ...

    而且,通过这些错误信息,既可以知道出错原因,也知道出错代码在程序中的位置,可以大大节省我们排查错误原因的时间,提高编程效率。

    3、HTTP异常处理

    日常开发中,我们经常会遇到404、500之类的HTTP错误码,表示页面未找到或者服务器错误之类的问题,Laravel为我们提供了单独的方法来处理这些错误异常:

    abort方法

    我们使用abort方法来简单抛出HTTP错误码异常,如果页面没找到或者数据不存在,我们使用如下方法抛出404异常:

    abort(404);

    如果是服务器授权认证失败,我们可以通过如下方式抛出403异常,当然,还可以传入错误信息到abort方法:

    abort(403,'对不起,您无权访问该页面!');

    对于抛出403异常的页面,默认显示如下:

    Laravel HTTP 403 错误

    这样的页面显然不能放到线上环境,那又应该如何为HTTP异常创建自定义视图呢?别担心,Laravel已经为我们做了周全的处理:

    错误页面视图

    如果要创建诸如404、403、500这样的HTTP异常自定义视图,只需在resources/views/errors目录创建与错误码对应的页面视图文件即可。比如要定义上述403异常自定义视图,可以创建resources/views/errors/403.blade.php文件,现在我们简单定义其内容如下:

    {{$exception->getMessage()}}

    这样再次测试403异常页面,显示如下:

    对不起,您无权访问该页面!

    没错,就是403.blade.php文件中的内容,是不是很方便?

    注:abort方法底层还是抛出相应异常,404错误抛出NotFoundHttpException,其他HTTP错误抛出HttpException

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 18:09 , Processed in 0.072114 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表