一步步编写PHP的Framework(九)
现在我们定义一个异常的基类,在Toper中为Tp_Exception,在这儿,我就直接叫BaseException吧,那BaseException.php肯定首先是有一个架子的:
1 |
2 | class BaseException extends Exception { |
3 | public function printStack() { |
4 |
5 | } |
6 | public function __toString() { |
7 |
8 | } |
9 | } |
最基础的,这个类肯定要继承自Exception,然后我需要实现__toString方法和另外一个自定义的printStack方法,实现__toString方法的原因是经常我们会直接throw new Exception() 这种方式抛出异常,它会直接调用__toString()方法,调用printStack方法就是输出堆栈信息。
说一下思路,首先这两个方法我们都需要判定是否是debug模式,如果是debug模式,那么很easy,直接输出即可,否则,跳转到错误页,但是跳转之前,必须要将异常信息写入到日志文件中去。
可能大家注意到,不管是__toString还是printStack如果debug关闭,都需要记录调试信息到日志文件,所以我们需要首先编写一个辅助函数:
1 | protected function _toLogFile($str) { |
2 | file_put_contents(APP_PATH . '/log',$str,FILE_APPEND); |
3 | } |
这儿,为了简便,我就直接使用file_put_contents了,这个函数功能很强大啊,我特别喜欢~~
由于到目前还没有讲URL重定向,转发请求等,暂时就直接显示错误页,所以又需要有一个辅助函数:
1 | protected function _outputErrorPage() { |
2 | header("content-type:text/html"); |
3 | echo file_get_contents(APP_PATH . '/error.html'); |
4 | } |
因为要求代码简单,所以错误页和日志文件都直接写死到项目根目录中,如果你有兴趣,可以自己试着将路径写在配置文件中,这个也不是很难的。
由于辅助函数已经写完,所以其他两个函数就很easy了:
1 | public function printStack() { |
2 | if(true === C('debug')) { |
3 | echo parent::getTraceAsString(); |
4 | } else { |
5 | $this->_toLogFile(parent::getTraceAsString()); |
6 | $this->_outputErrorPage(); |
7 | } |
8 | } |
1 | public function __toString() { |
2 | if(true !== C('debug')) { |
3 | $this->_toLogFile(parent::getTraceAsString()); |
4 | $this->_outputErrorPage(); |
5 | exit(); |
6 | } |
7 | return parent::__toString(); |
8 | } |
当然,由于__toString要返回字符串,而一旦throw一个异常,就会直接显示出来异常信息,为了在debug关闭之后不在页面显示异常信息,所以就直接在此处exit了,当然,我目前没有想到一个更好的办法,所以建议使用printStack来做。
我这个异常类就是用来抛砖引玉的,所以如果你有什么好的方法,请和我多多交流,互相学习,互相成长。
当然,现在只是定义了一个异常处理的基类,后面会写很多关于异常的子类,真正使用的时候是调用其子类的。
推荐阅读
-
php编写一个简单的路由类_PHP教程
-
Zend FrameWork有用吗?感觉仿佛颠复了基础的PHP建网站的方式,什么都得重新学
-
使用PHP编写基于Web的文件管理系统_PHP教程
-
PHP4 调用自己编写的 COM 组件_PHP
-
php编写的一个E-mail验证类_php实例
-
Zend FrameWork有用吗?感觉类乎颠复了基础的PHP建网站的方式,什么都得重新学
-
以前编写Like谓词被忽略的使用方法_PHP教程
-
简单的用PHP编写的导航条程序
-
编写PHP脚本来实现WordPress中评论分页的功能_PHP
-
Zend Framework实现将session存储在memcache中的方法_PHP