ThinkPHP源碼分析系列—異常處理

來源:互聯網
上載者:User
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 ]

?

當關閉調試機制時,也就是在生產環境中,可以自訂錯誤頁面顯示。如果系統找不到自訂錯誤顯示模板,則會渲染上面的異常頁面模板。

?

(完)

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.