摘要:在使用手動拋出異常時,希望跳轉到自定義的錯誤頁面,官方的文章中是這樣描述的。只能看源碼找問題了。而這個布局文件的路徑是一個相對路徑,這時如果你拋出異常的地方不是在的里,就找不到布局文件了。
在使用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
,也不會報這個錯)。
而這個布局文件的路徑是一個相對路徑,這時如果你拋出異常的地方不是在application
的controller
里,就找不到布局文件了。所以就報錯了。
怎么解決呢?其實也很簡單。給自定義的404頁面加上{__NOLAYOUT__}
就行了。
這一點官方文檔沒有說明,還在坑里的同學可以參考改下。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/1017.html
摘要:異常處理上節解讀源碼一自動加載看完了自動加載部分,根據代碼執行順序,的行注冊錯誤和異常處理機制加載慣例配置文件下面的加載配置文件不用說,現在重點看一下異常處理。博客鏈接解讀源碼二異常處理和請求生命周期 異常處理 上節解讀 thinkphp5 源碼(一):自動加載看完了自動加載部分,根據代碼執行順序,base.php的59-64行 // 注冊錯誤和異常處理機制 hinkError::r...
摘要:關于拋出異常如在我的上一篇文中所說的一樣在接口的設計中接口的返回的數據是非常重要的例如無法避免的等等這些都是要命的錯誤同時還有一個極大的問題就是在新增模塊中例如我最近需要新增一個的分詞查詢模塊這個在添加索引刪除索引等等操作的時候是非常容易導 showImg(http://pqykjwm6s.bkt.clouddn.com/Grassland_Scenery_by_Shi_Yuejun....
摘要:本文由云社區發表絕大多數程序只考慮了接口正常工作的場景,而用戶在使用我們的產品時遇到的各類異常,全都丟在看似的中。在面板,還可以對請求進行暫停延遲等網絡異常的模擬。小程序實現最后,留一道思考題。 本文由云+社區發表 絕大多數程序只考慮了接口正常工作的場景,而用戶在使用我們的產品時遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的兼容和兜底處理,會極大的影...
摘要:摘要徒手寫錯誤監控。為什么用定時器呢,因為在單頁應用中,路由的切換和地址欄的變化是無法被監控的,我確實沒有想到特別好的辦法來監控,所以用了這種方式,如果有人有更好的辦法,請給我留言,謝謝。 摘要: 徒手寫JS錯誤監控。 作者:一步一個腳印一個坑 原文:搭建前端監控系統(二)JS錯誤監控篇 Fundebug經授權轉載,版權歸原作者所有。 背景:市面上的監控系統有很多,大多收費,對于...
摘要:最后用來處理正常的邏輯,這是一個較好的異常處理寫法。上一篇文章網絡爬蟲實戰使用發送請求下一篇文章網絡爬蟲實戰使用解析鏈接 上一篇文章:Python3網絡爬蟲實戰---20、使用Urllib:發送請求下一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接 在前面一節我們了解了 Request 的發送過程,但是在網絡情況不好的情況下,出現了異常怎么辦呢?這時如果我們...
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00