以前讲到过对于异常的处理机制,最好能够自定义异常,若是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
代码点此下载