以前講到過對於異常的處理機制,最好能夠自定義異常,若是debug打開,那麼顯示具體的調試信息,若是debug關閉,那麼將異常記錄到日誌,而後跳轉到錯誤頁,這節課我就主要來說一下這個異常處理機制。 php
如今咱們定義一個異常的基類,在Toper中爲Tp_Exception,在這兒,我就直接叫BaseException吧,那BaseException.php確定首先是有一個架子的: html
<?php class BaseException extends Exception { public function printStack() { } public function __toString() { } }
最基礎的,這個類確定要繼承自Exception,而後我須要實現__toString方法和另一個自定義的printStack方法,實現__toString方法的緣由是常常咱們會直接throw new Exception() 這種方式拋出異常,它會直接調用__toString()方法,調用printStack方法就是輸出堆棧信息。 函數
說一下思路,首先這兩個方法咱們都須要斷定是不是debug模式,若是是debug模式,那麼很easy,直接輸出便可,不然,跳轉到錯誤頁,可是跳轉以前,必需要將異常信息寫入到日誌文件中去。 學習
可能你們注意到,無論是__toString仍是printStack若是debug關閉,都須要記錄調試信息到日誌文件,因此咱們須要首先編寫一個輔助函數: this
protected function _toLogFile($str) { file_put_contents(APP_PATH . '/log',$str,FILE_APPEND); }這兒,爲了簡便,我就直接使用file_put_contents了,這個函數功能很強大啊,我特別喜歡~~
因爲到目前尚未講URL重定向,轉發請求等,暫時就直接顯示錯誤頁,因此又須要有一個輔助函數: debug
protected function _outputErrorPage() { header("content-type:text/html"); echo file_get_contents(APP_PATH . '/error.html'); }由於要求代碼簡單,因此錯誤頁和日誌文件都直接寫死到項目根目錄中,若是你有興趣,能夠本身試着將路徑寫在配置文件中,這個也不是很難的。
因爲輔助函數已經寫完,因此其餘兩個函數就很easy了: 調試
public function printStack() { if(true === C('debug')) { echo parent::getTraceAsString(); } else { $this->_toLogFile(parent::getTraceAsString()); $this->_outputErrorPage(); } }
public function __toString() { if(true !== C('debug')) { $this->_toLogFile(parent::getTraceAsString()); $this->_outputErrorPage(); exit(); } return parent::__toString(); }
固然,因爲__toString要返回字符串,而一旦throw一個異常,就會直接顯示出來異常信息,爲了在debug關閉以後不在頁面顯示異常信息,因此就直接在此處exit了,固然,我目前沒有想到一個更好的辦法,因此建議使用printStack來作。 日誌
我這個異常類就是用來拋磚引玉的,因此若是你有什麼好的方法,請和我多多交流,互相學習,互相成長。 code
固然,如今只是定義了一個異常處理的基類,後面會寫不少關於異常的子類,真正使用的時候是調用其子類的。 htm
代碼點此下載