V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
33130317
V2EX  ›  PHP

告别 ThinkPHP6 的异常页面, 让我们来拥抱 whoops 吧

  •  
  •   33130317 · 2020-03-01 23:02:17 +08:00 · 4365 次点击
    这是一个创建于 1727 天前的主题,其中的信息可能已经有所发展或是发生改变。

    春节期间熟悉了 TP6, 也写了一个 TP6 的博客程序,但系统的异常页面实在另外头疼,很多时候无法查看到是哪行代码出的问题。

    所以就特别的想把 whoops 引进来,经过一系列的研究,终于找到了解决的办法:

    1. 通过 composer 安装 whoops

    运行命令:  composer require filp/whoops

    注意:composer 引进的文件如果有语法错误,需要提前把语法错误处理好才能进行安装,否则一直报错。

    2. 使用 whoops 接管 tp6 的异常处理

    在 /app/ExceptionHandle.php 文件的 render()方法中加入如下代码:

    // 添加自定义异常处理机制
    if (ENV('APP_DEBUG')) {
        // 如果是 HttpResponseException 异常则原样输出
        // JUMP 插件里的 success,error 和 result 方法均返回的是 HttpResponseException 异常
        if ($e instanceof HttpResponseException) {
            return $e->getResponse();
        }
    
        // Whoops 接管请求异常
        $whoops = new \Whoops\Run;
        $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());
        return Response::create(
            $whoops->handleException($e),
            'html',
            500
        );
    }
    

    如下图:

    老刘博客

    3. 看看结果吧

    我在博客首页的 index 方法中写入了一个不存在的函数:

    老刘博客

    刷新页面一看, 妥了

    老刘博客

    OK. 熟悉的 whoops 又回来了.

    4. 后记

    为了在 thinkphp6 中使用 whoops, 我又认真的看了一遍 PHP7 中的异常机制,终于是把 whoops 给引进来了.

    在学习异常处理的过程中, 我也发现在 PHP7 中应该使用 try()catch()来进行业务处理, 而不是再使用 if()else()了.

    后续我会单独写篇文章来讲述我在研究 PHP7 的异常中获得的经验.

    也希望大家能继续关注我的博客 http://laoliu.pro

    原文链接:http://laoliu.pro/php/6.html

    18 条回复    2020-03-02 16:43:13 +08:00
    yafoo
        1
    yafoo  
       2020-03-01 23:26:43 +08:00 via Android
    请问 nodejs 程序异常时,如何在页面上显示出错行等信息?
    casper13
        2
    casper13  
       2020-03-01 23:27:10 +08:00
    Environment Variables
    APP_DEBUG 1
    APP_DEFAULT_TIMEZONE Asia/Shanghai
    DATABASE_TYPE mysql
    DATABASE_HOSTNAME 127.0.0.1
    DATABASE_DATABASE laoliu2020
    DATABASE_USERNAME root
    DATABASE_PASSWORD *********-2020
    DATABASE_HOSTPORT 3306
    DATABASE_CHARSET utf8
    DATABASE_DEBUG 1
    DATABASE_PREFIX llp_
    LANG_DEFAULT_LANG zh-cn

    处理一下
    2kCS5c0b0ITXE5k2
        3
    2kCS5c0b0ITXE5k2  
       2020-03-01 23:37:10 +08:00
    用 try catch 来捕抓异常是很正常的啊... 而且 php5 就有了啊 注意跟上啊
    33130317
        4
    33130317  
    OP
       2020-03-02 08:59:15 +08:00
    @emeab 是啊已经落后了. 今年就打算迎头跟上了.
    之前因为团队原因, 所以技术栈普遍落后.
    今年打算将技术栈整理更新为最新的.正在努力中.
    33130317
        5
    33130317  
    OP
       2020-03-02 09:02:21 +08:00
    @yafoo nodejs 的还真是不怎么明白
    33130317
        6
    33130317  
    OP
       2020-03-02 09:04:24 +08:00
    @casper13 不懂就问, 麻烦告诉下如何查看这些 ENV 的信息吗? tp6 和 env 都是刚接触, 还不知道如何处理
    masker
        7
    masker  
       2020-03-02 10:48:50 +08:00 via Android
    laravel 出新功能了。
    thinkphp:抄
    33130317
        8
    33130317  
    OP
       2020-03-02 10:55:49 +08:00
    @masker 我感觉也是. 抄的痕迹挺重的.
    unicloud
        9
    unicloud  
       2020-03-02 12:18:23 +08:00 via iPhone
    @masker 你要是唠这个的话,我可就不困了啊.gif
    liuguang
        10
    liuguang  
       2020-03-02 12:46:33 +08:00
    不如不用 tp,哈哈😄
    st2udio
        11
    st2udio  
       2020-03-02 12:49:58 +08:00
    这个界面好熟悉的味道
    ben1024
        12
    ben1024  
       2020-03-02 13:30:26 +08:00
    tp 的异常虽然 UI 不是很好,对工程师体验还是友好些的
    33130317
        13
    33130317  
    OP
       2020-03-02 14:06:34 +08:00
    @ben1024 我受不了的是不能显示堆栈信息, 只是显示最后一个错误的话就没办法查到是哪里出了错误
    2kCS5c0b0ITXE5k2
        14
    2kCS5c0b0ITXE5k2  
       2020-03-02 14:28:04 +08:00
    @33130317 然而 tp 是有的 最下面.
    ysc3839
        15
    ysc3839  
       2020-03-02 14:32:14 +08:00 via Android
    @yafoo Node.js 的话要看是什么 http 框架了,express 的话默认会输出错误信息的。
    sunny2580839896
        16
    sunny2580839896  
       2020-03-02 14:49:31 +08:00
    @33130317 #6 大佬,这个是怎么看的???
    yafoo
        17
    yafoo  
       2020-03-02 16:16:51 +08:00 via Android
    @ysc3839 使用 koa 框架,出错时,命令行控制台会显示出错行,用页面输出的话,不知道怎么能显示出来?
    ysc3839
        18
    ysc3839  
       2020-03-02 16:43:13 +08:00 via Android
    @yafoo 翻了下文档,和 express 不一样,koa 要在开头添加一个 middleware,用 try catch 来捕获后续 middleware 的错误。catch 后自己输出到 response 即可。
    https://github.com/koajs/koa/wiki/Error-Handling#catching-downstream-errors
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2453 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:26 · PVG 09:26 · LAX 17:26 · JFK 20:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.