ThinkPHP源碼分析系列—錯誤處理
ThinkPHP有一個全域函數halt專門用來對錯誤進行格式化輸出顯示,可以在系統函數庫中找到它。通過這個函數,可以保證應用程式錯誤處理的一致性。
先把代碼貼上來:
function halt($error) { if (IS_CLI) exit($error); $e = array(); if (C('APP_DEBUG')) { //偵錯模式下輸出錯誤資訊 if (!is_array($error)) { $trace = debug_backtrace(); // 返回多維陣列 $e['message'] = $error; $e['file'] = $trace[0]['file']; $e['class'] = $trace[0]['class']; $e['function'] = $trace[0]['function']; $e['line'] = $trace[0]['line']; $traceInfo = ''; $time = date("y-m-d H:i:m", $_SERVER["REQUEST_TIME"]); foreach ($trace as $t) { $traceInfo .= '[' . $time . '] ' . $t['file'] . ' (' . $t['line'] . ') '; $traceInfo .= $t['class'] . $t['type'] . $t['function'] . '('; $traceInfo .= implode(', ', $t['args']); $traceInfo .= ")
"; } $e['trace'] = $traceInfo; } else { $e = $error; } // 包含異常頁面模板 include C('TMPL_EXCEPTION_FILE'); } else { //否則定向到錯誤頁面 $error_page = C('ERROR_PAGE'); if (!empty($error_page)) { redirect($error_page);// 自訂錯誤頁面 } else { if (C('SHOW_ERROR_MSG')) $e['message'] = is_array($error) ? $error['message'] : $error; else $e['message'] = C('ERROR_MESSAGE'); // 包含異常頁面模板 include C('TMPL_EXCEPTION_FILE'); } } exit; // 發生錯誤時,退出程式}
?
halt函數首先會檢查PHP的SAPI(伺服器端應用編程介面),如果為CLI方式,則直接退出程式。目前流行的方式是PHP作為一個模組被載入到Apache中,這個時候PHP的SAPI為apache2handler。ThinkPHP為方便應用程式的開發,提供了一套調試機制。當處於開發階段時,可以開啟調試機制,方便查錯。而在部署環境階段時,則關閉調試機制,提高應用的效率和安全性。在這兩種情況下,錯誤處理也是不同的。
當開啟調試機制時,如果傳遞的錯誤資料資訊不是以數組形式儲存的,則將PHP內建回溯函數debug_backtrace處理的資料存放區在一數組中,其中包括錯誤資訊,檔案名稱,類和函數等資料。如果傳遞的錯誤資料資訊是以數組形式儲存的,則為該數組建立索引即可。最後通過配置的異常頁面模板格式化顯示錯誤資訊,預設異常頁面模板放在架構模板目錄下,關鍵內容貼在這裡:
系統發生錯誤
您可以選擇 [ ">重試 ] [ 返回 ] 或者 [ ">回到首頁 ]錯誤位置: FILE: LINE:
[ 錯誤資訊 ]
[ TRACE ]
?
當關閉調試機制時,也就是在生產環境中,可以自訂錯誤頁面顯示。如果系統找不到自訂錯誤顯示模板,則會渲染上面的異常頁面模板。
?
(完)