• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

一步步编写PHP的Framework(九)_php

php 搞代码 7年前 (2018-06-21) 189次浏览 已收录 0个评论

 

       之前讲到过对于异常的处理机制,最好可以自定义异常,如果debug打开,那么显示具体的调试信息,如果debug关闭,那么将异常记录到日志,然后跳转到错误页,这节课我就主要来讲一下这个异常处理机制。

       现在我们定义一个异常的基类,在Toper中为Tp_Exception,在这儿,我就直接叫BaseException吧,那BaseException.php肯定首先是有一个架子的:

1 <?php
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的Framework(九)_php》,跪求各位点评,若觉得好的话请收藏本文,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:一步步编写PHP的Framework(九)_php

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址