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 = ‘[email protected]‘;
 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:

时间: 2024-10-24 04:46:17

PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息的相关文章

PHP 错误与异常 笔记与总结(10)错误处理器测试

关联文件:myErrorHandler.php (上一篇) 先测试通知级别的错误的自定义处理: testErrorHandler.php <?php require_once 'myErrorHandler.php'; error_reporting(-1); set_error_handler(array('myErrorHandler', 'deal')); //通知级别错误 echo $notice; 运行,在 D:\practise\php\From\notice 生成 noticeLo

PHP 错误与异常 笔记与总结(16 )自定义异常处理器

可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常). set_exception_handler():设置一个用户定义的异常处理函数,当一个未捕获的异常发生时所调用函数的名称(回调函数),该函数必须在调用 set_exception_handler() 之前已经定义.该处理函数需要接受一个参数,该参数是一个抛出的异常对象 [例] 1 <?php 2 header('content-type:text/html; charset=utf-8'); 3 head

《C++ Primer Plus》第15章 友元、异常和其他 学习笔记

友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有助于设计这样的助手类,即实现其他类,单必须是共有接口的组成部分.C++机场机制为处理拙劣的编程事件,如不适当的I/O失败等,提供了一种灵活的方式.引发异常将终止当前值性的函数,将控制权传给匹配的catch块.catch块紧跟在try块的后面,为捕获异常,直接或间接导致异常的函数调用必须为与try块中

Java异常笔记整理

参考书籍:Head First Java 1.假设某方法是别人写在某个类里面的 2.而此时你根本就不知道这个方法是否有风险(比如服务器出故障会使程序受到影响): 3.那最好的方法应该就是,在调用这个类的方法时,加上可能发生异常的处理方案,未雨绸缪. 关键字:try……catch,throws,throw,finally try……catch其实就是给编译器的一个信号,表示你已经注意到了这个异常并开始着手进行应对: 编译器需要程序员try包裹住可能发生异常的代码,再通过catch去处理 Runti

异常笔记补充

异常(Throwable) 1.异常定义: 生活中的异常--有异于常态,和正常情况不太一样,有错误出现. Java中的异常--程序运行期间有可能出现的问题,阻止当前方法或作用域继续执行,即称之为异常. 2.分类: (1)错误(Error):主要包括虚拟机错误(VirtualMachineError)和线程四锁(ThreadDeath),出现后程序彻底崩溃 (2)异常(Exception):主要包括非检查异常(RuntimeException)和检查异常. 非检查异常主要包括:空指针异常(Null

Guava学习笔记:guava Throwables帮你处理异常,抛出异常

Guava学习笔记:guava Throwables帮你处理异常,抛出异常 guava类库中的Throwables提供了一些异常处理的静态方法,这些方法的从功能上分为两类,一类是帮你抛出异常,另外一类是帮你处理异常. 也许你会想:为什么要帮我们处理异常呢?我们自己不会抛出异常吗? 假定下面的方法是我们要调用的方法.     public void doSomething() throws Throwable {         //ignore method body     }     pub

C++ Primer Plus 第15章 友元、异常和其他

第15章 友元.异常和其他 1.友元不仅有友元函数,还能是友元类 还可以将类中的某一个成员函数指定为另一个类的友元 尽管友元被授予从外部访问私有部门的权限,单并不与面向对象编程思想相愽,相反,它们提高了公有接口的灵活性 2.类的成员函数作为其他类的友元,涉及到类的声明顺序. 还有一个函数作为两个类的友元 这方面内容看P607-611 3.嵌套类:在另一个类中声明的类被称为嵌套类 类嵌套与包含不一样.包含意味着将一个类对象作为另一个类的成员,而对类进行嵌套不创建类成员,而是定义了一种类型. 4.对

Spring学习笔记——Spring事务仅仅对执行时异常回滚

我们在使用Spring时候一般都知道事务在遇到异常的时候会回滚.岂不知Spring的事务默认仅仅有在发生执行时异常即:RunTimeException时才会发生事务,假设一个方法抛出Exception或者Checked异常Spring的事务并不会回滚. 以下我们来看看异常的分类.异常一般分为Checked异常和RunTime异常. CheckedException: Java觉得Checked异常都是能够被处理的异常,所以Java程序必须显式的处理Checked异常,假设程序没有处理checke

java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误

/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeException nor an Error. * @param ex the throwable to check * @return whether the throwable is a checked exception * @see java.lang.Exception * @see java.lang

编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

原文:编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误.不要在不恰当的场合下引发异常.重新引发异常时使用inner Exception] 前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是"效率"问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题,只有引发异常时才会带来效率问题.基于这一点,很多开发者已经达成共识:不应将异常机制用于正常控制流中.达成的另一个共识是:CLR异常机制带来