一、入口文件關閉調試,配置文件配置異常頁面
在生產環境中系統的錯誤信息不能暴露給用戶,入口文件的 APP_DEBUG 默認為開啟狀態
define('APP_DEBUG',true);
此時如果用戶訪問到不存在的模塊、控制器或者方法會出現:

在生產環境中需要把 APP_DEBUG 設置為 FALSE 或者將該定義屏蔽:
define('APP_DEBUG',false);
此時如果用戶訪問到不存在的模塊、控制器或者方法會出現:

這個錯誤的默認模板頁在 ./ThinkPHP/Tpl/think_exception.tpl,可以設置自定義的異常頁面來代替 ThinkPHP 默認的錯誤頁面,在配置文件 config.php 中配置:
//異常頁面 'TMPL_EXCEPTION_FILE' => './Public/Admin/error.html',
在訪問不存在的模塊、控制器或方法時,會加載默認的或者自定義的異常頁面模板。
二、定義 EmptyController 類
例如在 Admin 模塊下創建一個 EmptyController.class.php,里面的 index 方法定義當用戶訪問一個不存在的控制器時系統該如何處理:
<?php namespace Admin\Controller; use Think\Controller; class EmptyController extends Controller{ public function index(){ //跳轉或加載404頁 } }
三、定義空操作 _empty()
例如在 Admin 模塊的 Common 控制器中定義一個 _empty() 方法,當用戶訪問一個不存在的方法時,就會按照空方法中的設置進行處理:
//空方法 function _empty() { //跳轉或加載404頁 }
注:如果同時請求一個不存在的控制器和一個不存在的方法,或者請求一個不存在的模塊時,會加載默認或者自定義的異常頁面,而不會執行 EmptyController::index 或 _empty()。
四、數據庫錯誤
在默認情況下,如果程序中的 SQL 語句出現了語法錯誤,很可能會把數據庫信息暴露給用戶:

注:在 APP_DEBUG 為 TRUE 且沒有自定義異常頁面時發生數據庫錯誤會輸出以上信息。
在關閉 APP_DEBUG 后,遇到數據庫錯誤時,會加載默認的或者自定義的異常頁面。如果希望在發生數據庫錯誤時進行自定的處理時,可以在配置文件中設置數據庫調試模式為 FALSE(該配置默認值是 TRUE):
'DB_DEBUG' => FALSE, // 數據庫調試模式 開啟后可以記錄SQL日志 3.2.3新增
當該選項開啟時,會記錄 SQL 日志,路徑是 ./Application/Runtime/Logs/YourModule/

但是當該選項開啟時,無法自定義處理異常,只能加載系統默認或者自定義的一場模板。如果關閉該選項,同時在開發時與數據庫相關的操作都必須捕獲異常,例如:
$result = M('session')->field('a')->select(); if($result === false) { //處理 }
或者
try { $result= M("session")->field('a')->select(); } catch (\Exception $e) { //處理 }
注:捕獲異常可以參見 ./ThinkPHP/Library/Think/Db/Driver.class.php Line:169
try{ $result = $this->PDOStatement->execute(); // 調試結束 $this->debug(false); if ( false === $result ) { $this->error(); return false; } else { return $this->getResult(); } }catch (\PDOException $e) { $this->error(); return false; }
