资讯专栏INFORMATION COLUMN

关于thinkphp5手动抛出Http异常时自定义404页面报错的问题

番茄西红柿 / 1983人阅读

摘要:在使用手动抛出异常时,希望跳转到自定义的错误页面,官方的文章中是这样描述的。只能看源码找问题了。而这个布局文件的路径是一个相对路径,这时如果你抛出异常的地方不是在的里,就找不到布局文件了。

在使用HttpException手动抛出异常时,希望跳转到自定义的错误页面,官方的文章中是这样描述的。

可以使用thinkexceptionHttpException类来抛出异常

// 抛出 HTTP 异常  
throw new thinkexceptionHttpException(404, 异常消息, null, [参数]);  

一旦抛出了HttpException异常,可以支持定义多带带的异常页面的模板地址,只需要在应用配置文件中增加:

http_exception_template    =>  [  
    // 定义404错误的重定向页面地址  
    404 =>  APP_PATH.404.html,  
    // 还可以定义其它的HTTP status  
    401 =>  APP_PATH.401.html,  
]  

然而如果你这些都做完了,关闭调试模式,你会发现还是跳转到官方自定义的页面上去了,并且你发现http状态码是500,这是代码有问题啊,我抛出的是404啊。

然后打开log日志,你会发现果然报错了。

[ error ] [1]Uncaught thinkexceptionTemplateNotFoundException: template not exists:view/layout.html in /Applications/MAMP/htdocs/best.shiqidu.com/thinkphp/library/think/Template.php:1082  
Stack trace:  

这。。。
可怎么办。。。

只能看源码找问题了。

你会发现这个方法被调用了两次。

/**  
     * 解析模板文件名  
     * @access private  
     * @param  string $template 文件名  
     * @return string|false  
     */  
    private function parseTemplateFile($template)  
    {...}  

第一次时$template模板文件时能找到的。但是第二次也是一个相对路径view/layout,所以报错了,继续顺藤摸瓜,发现这个函数。

/**  
     * 编译模板文件内容  
     * @access private  
     * @param string    $content 模板内容  
     * @param string    $cacheFile 缓存文件名  
     * @return void  
     */  
    private function compiler(&$content, $cacheFile)  
    {  
        // 判断是否启用布局  
        if ($this->config[layout_on]) {  
            if (false !== strpos($content, {__NOLAYOUT__})) {  
                // 可以多带带定义不使用布局  
                $content = str_replace({__NOLAYOUT__}, , $content);  
            } else {  
                // 读取布局模板  
                $layoutFile = $this->parseTemplateFile($this->config[layout_name]);  
                if ($layoutFile) {  
                    // 替换布局的主体内容  
                    $content = str_replace($this->config[layout_item], $content, file_get_contents($layoutFile));  
                }  
            }  
        } else {  
            $content = str_replace({__NOLAYOUT__}, , $content);  
        }  
...  

 

关键就是这里了,如果你没有{__NOLAYOUT__}这个表示的话,它在渲染自定义404页面时会去加载布局文件(如果你在配置文件里开启了布局,如果没开启layout=true,也不会报这个错)。
而这个布局文件的路径是一个相对路径,这时如果你抛出异常的地方不是在applicationcontroller里,就找不到布局文件了。所以就报错了。

怎么解决呢?其实也很简单。给自定义的404页面加上{__NOLAYOUT__}就行了。

这一点官方文档没有说明,还在坑里的同学可以参考改下。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/1017.html

相关文章

  • 解读 thinkphp5 源码(二):异常处理和请求生命周期

    摘要:异常处理上节解读源码一自动加载看完了自动加载部分,根据代码执行顺序,的行注册错误和异常处理机制加载惯例配置文件下面的加载配置文件不用说,现在重点看一下异常处理。博客链接解读源码二异常处理和请求生命周期 异常处理 上节解读 thinkphp5 源码(一):自动加载看完了自动加载部分,根据代码执行顺序,base.php的59-64行 // 注册错误和异常处理机制 hinkError::r...

    yuanzhanghu 评论0 收藏0
  • 带你抛出优雅的处理系统异常

    摘要:关于抛出异常如在我的上一篇文中所说的一样在接口的设计中接口的返回的数据是非常重要的例如无法避免的等等这些都是要命的错误同时还有一个极大的问题就是在新增模块中例如我最近需要新增一个的分词查询模块这个在添加索引删除索引等等操作的时候是非常容易导 showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....

    susheng 评论0 收藏0
  • 99%的程序都没有考虑的网络异常

    摘要:本文由云社区发表绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似的中。在面板,还可以对请求进行暂停延迟等网络异常的模拟。小程序实现最后,留一道思考题。 本文由云+社区发表 绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中。如果没有做好异常的兼容和兜底处理,会极大的影...

    HollisChuang 评论0 收藏0
  • 一步一步搭建前端监控系统:JS错误监控篇

    摘要:摘要徒手写错误监控。为什么用定时器呢,因为在单页应用中,路由的切换和地址栏的变化是无法被监控的,我确实没有想到特别好的办法来监控,所以用了这种方式,如果有人有更好的办法,请给我留言,谢谢。 摘要: 徒手写JS错误监控。 作者:一步一个脚印一个坑 原文:搭建前端监控系统(二)JS错误监控篇 Fundebug经授权转载,版权归原作者所有。 背景:市面上的监控系统有很多,大多收费,对于...

    EdwardUp 评论0 收藏0
  • Python3网络爬虫实战---21、使用Urllib:处理异常

    摘要:最后用来处理正常的逻辑,这是一个较好的异常处理写法。上一篇文章网络爬虫实战使用发送请求下一篇文章网络爬虫实战使用解析链接 上一篇文章:Python3网络爬虫实战---20、使用Urllib:发送请求下一篇文章:Python3网络爬虫实战---22、使用Urllib:解析链接 在前面一节我们了解了 Request 的发送过程,但是在网络情况不好的情况下,出现了异常怎么办呢?这时如果我们...

    hlcfan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<