zoukankan      html  css  js  c++  java
  • PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息

    使异常处理变得更灵活、可观察,可以使用设计模式中的观察者模式。

     文件 ① 定义观察者的接口

    ExceptionObserver.php:

    1 <?php
    2 /*
    3     给观察者定义的规范
    4 */
    5 interface ExceptionObserver{
    6     public function update(Observer_Exception $e);
    7 }

    文件 ② 观察者模式的自定义异常类 Observer_Exception

    Observer_Exception.php:

     1 <?php
     2 class Observer_Exception extends Exception{
     3     //保存观察者信息,静态属性
     4     public static $_observer = array();
     5     //添加观察者,静态方法
     6     public static function attach(ExceptionObserver $observer){
     7         //添加成员
     8         self::$_observer[] = $observer;
     9     } 
    10 
    11     //重载父类的构造函数
    12     public function __construct($message = null, $code = 0){
    13         parent::__construct($message, $code);
    14         $this->notify();
    15     }
    16 
    17     //通知每一个观察者的方法
    18     public function notify(){
    19         foreach(self::$_observer as $observer){
    20             $observer->update($this);
    21         }
    22     }
    23 }

    文件 ③ 观察者1.把异常信息记录到文件中

    Log_Exception_Observer.php:

     1 <?php
     2 //观察者1.把异常记录到日志文件中
     3 class Log_Exception_Observer implements ExceptionObserver{
     4     protected $_filename = 'D:/practise/php/Error/LogException.log';
     5     public function __construct($filename = null){
     6         if($filename != null && is_string($filename)){
     7             $this->_filename = $filename;
     8         }
     9     }
    10 
    11     public function update(Observer_Exception $e){
    12         $message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
    13         $message .= '信息:'.$e->getMessage().PHP_EOL;
    14         $message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
    15         $message .= '文件'.$e->getFile().PHP_EOL;
    16         $message .= '行号'.$e->getLine().PHP_EOL;
    17         error_log($message, 3, $this->_filename);
    18     }
    19 }
    20  

    文件 ④ 观察者5.把异常信息通过邮件形式发送给管理员

    Email_Exception_Observer.php:

     1 <?php
     2 //观察者2.把异常记录通过邮件形式发送
     3 class Email_Exception_Observer implements ExceptionObserver{
     4     protected $_email = '472323087@qq.com';
     5     public function __construct($email = null){
     6         if($email != null && filter_var($email, FILTER_VALIDATE_EMAIL)){
     7             $this->_email = $email;
     8         }
     9     }
    10 
    11     public function update(Observer_Exception $e){
    12         $message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
    13         $message .= '信息:'.$e->getMessage().PHP_EOL;
    14         $message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
    15         $message .= '文件'.$e->getFile().PHP_EOL;
    16         $message .= '行号'.$e->getLine().PHP_EOL;
    17         error_log($message, 1, $this->_email);
    18     }
    19 }
    20  

    文件⑤ 测试文件

    testObersver.php:

     1 <?php
     2 header('content-type:text/html; charset=utf-8');
     3 
     4 require 'ExceptionObserver.php';    //接口
     5 require 'Observer_Exception.php';    //观察者模式的自定义异常类
     6 require 'Log_Exception_Observer.php';    //观察者1
     7 require 'Email_Exception_Observer.php';        //观察者2
     8 
     9 //添加观察者,把异常信息记录在文件中
    10 Observer_Exception::attach(new Log_Exception_Observer());//不传参数则保存到默认的文件中
    11 
    12 //自定义异常类
    13 class MyException extends Observer_Exception{
    14     public function test(){
    15         echo '测试1:自定义方法处理异常';
    16     }
    17 }
    18 
    19 //测试
    20 try{
    21     throw new MyException('出现异常,记录');
    22 }catch(MyException $e){
    23     echo $e->getMessage();
    24     echo '<hr>';
    25     $e->test();
    26 }

    运行 testObersver.php,输出:

    同时文件 LogException.log:

  • 相关阅读:
    MVC NonAction属性
    未将对象引用设置到对象的实例
    回调函数callback
    Json详解
    浅谈HTTP中Get与Post的区别
    JQuery $.ajax()方法详解
    C#中Const和Readonly的区别
    全面解释StringBuilder、StringBuffer和String的关系
    基本数据类型的包装类和随机数
    枚举类的使用
  • 原文地址:https://www.cnblogs.com/dee0912/p/4621450.html
Copyright © 2011-2022 走看看