摘要:在使用手動拋出異常時(shí),希望跳轉(zhuǎn)到自定義的錯(cuò)誤頁面,官方的文章中是這樣描述的。只能看源碼找問題了。而這個(gè)布局文件的路徑是一個(gè)相對路徑,這時(shí)如果你拋出異常的地方不是在的里,就找不到布局文件了。
在使用HttpException
手動拋出異常時(shí),希望跳轉(zhuǎn)到自定義的錯(cuò)誤頁面,官方的文章中是這樣描述的。
可以使用thinkexceptionHttpException
類來拋出異常
// 拋出 HTTP 異常 throw new thinkexceptionHttpException(404, 異常消息, null, [參數(shù)]);
一旦拋出了HttpException
異常,可以支持定義多帶帶的異常頁面的模板地址,只需要在應(yīng)用配置文件中增加:
http_exception_template => [ // 定義404錯(cuò)誤的重定向頁面地址 404 => APP_PATH.404.html, // 還可以定義其它的HTTP status 401 => APP_PATH.401.html, ]
然而如果你這些都做完了,關(guān)閉調(diào)試模式,你會發(fā)現(xiàn)還是跳轉(zhuǎn)到官方自定義的頁面上去了,并且你發(fā)現(xiàn)http狀態(tài)碼是500
,這是代碼有問題啊,我拋出的是404
啊。
然后打開log日志,你會發(fā)現(xiàn)果然報(bào)錯(cuò)了。
[ 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:
這。。。
可怎么辦。。。
只能看源碼找問題了。
你會發(fā)現(xiàn)這個(gè)方法被調(diào)用了兩次。
/** * 解析模板文件名 * @access private * @param string $template 文件名 * @return string|false */ private function parseTemplateFile($template) {...}
第一次時(shí)$template模板文件時(shí)能找到的。但是第二次也是一個(gè)相對路徑view/layout
,所以報(bào)錯(cuò)了,繼續(xù)順藤摸瓜,發(fā)現(xiàn)這個(gè)函數(shù)。
/** * 編譯模板文件內(nèi)容 * @access private * @param string $content 模板內(nèi)容 * @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) { // 替換布局的主體內(nèi)容 $content = str_replace($this->config[layout_item], $content, file_get_contents($layoutFile)); } } } else { $content = str_replace({__NOLAYOUT__}, , $content); } ...
關(guān)鍵就是這里了,如果你沒有{__NOLAYOUT__}
這個(gè)表示的話,它在渲染自定義404頁面時(shí)會去加載布局文件(如果你在配置文件里開啟了布局,如果沒開啟layout=true
,也不會報(bào)這個(gè)錯(cuò))。
而這個(gè)布局文件的路徑是一個(gè)相對路徑,這時(shí)如果你拋出異常的地方不是在application
的controller
里,就找不到布局文件了。所以就報(bào)錯(cuò)了。
怎么解決呢?其實(shí)也很簡單。給自定義的404頁面加上{__NOLAYOUT__}
就行了。
這一點(diǎn)官方文檔沒有說明,還在坑里的同學(xué)可以參考改下。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/1017.html
摘要:異常處理上節(jié)解讀源碼一自動加載看完了自動加載部分,根據(jù)代碼執(zhí)行順序,的行注冊錯(cuò)誤和異常處理機(jī)制加載慣例配置文件下面的加載配置文件不用說,現(xiàn)在重點(diǎn)看一下異常處理。博客鏈接解讀源碼二異常處理和請求生命周期 異常處理 上節(jié)解讀 thinkphp5 源碼(一):自動加載看完了自動加載部分,根據(jù)代碼執(zhí)行順序,base.php的59-64行 // 注冊錯(cuò)誤和異常處理機(jī)制 hinkError::r...
摘要:關(guān)于拋出異常如在我的上一篇文中所說的一樣在接口的設(shè)計(jì)中接口的返回的數(shù)據(jù)是非常重要的例如無法避免的等等這些都是要命的錯(cuò)誤同時(shí)還有一個(gè)極大的問題就是在新增模塊中例如我最近需要新增一個(gè)的分詞查詢模塊這個(gè)在添加索引刪除索引等等操作的時(shí)候是非常容易導(dǎo) showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....
摘要:本文由云社區(qū)發(fā)表絕大多數(shù)程序只考慮了接口正常工作的場景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似的中。在面板,還可以對請求進(jìn)行暫停延遲等網(wǎng)絡(luò)異常的模擬。小程序?qū)崿F(xiàn)最后,留一道思考題。 本文由云+社區(qū)發(fā)表 絕大多數(shù)程序只考慮了接口正常工作的場景,而用戶在使用我們的產(chǎn)品時(shí)遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會極大的影...
摘要:摘要徒手寫錯(cuò)誤監(jiān)控。為什么用定時(shí)器呢,因?yàn)樵趩雾搼?yīng)用中,路由的切換和地址欄的變化是無法被監(jiān)控的,我確實(shí)沒有想到特別好的辦法來監(jiān)控,所以用了這種方式,如果有人有更好的辦法,請給我留言,謝謝。 摘要: 徒手寫JS錯(cuò)誤監(jiān)控。 作者:一步一個(gè)腳印一個(gè)坑 原文:搭建前端監(jiān)控系統(tǒng)(二)JS錯(cuò)誤監(jiān)控篇 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 背景:市面上的監(jiān)控系統(tǒng)有很多,大多收費(fèi),對于...
摘要:最后用來處理正常的邏輯,這是一個(gè)較好的異常處理寫法。上一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)使用發(fā)送請求下一篇文章網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)使用解析鏈接 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---20、使用Urllib:發(fā)送請求下一篇文章:Python3網(wǎng)絡(luò)爬蟲實(shí)戰(zhàn)---22、使用Urllib:解析鏈接 在前面一節(jié)我們了解了 Request 的發(fā)送過程,但是在網(wǎng)絡(luò)情況不好的情況下,出現(xiàn)了異常怎么辦呢?這時(shí)如果我們...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3557·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00