怎麼一步步編寫簡單的PHP的Framework(九)

      以前講到過對於異常的處理機制,最好能夠自定義異常,若是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

        代碼點此下載

相關文章
相關標籤/搜索