PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息
使异常处理变得更灵活、可观察,可以使用设计模式中的观察者模式。
文件 ① 定义观察者的接口
ExceptionObserver.php:
<?php
/*
给观察者定义的规范
*/
interface ExceptionObserver{
public function update(Observer_Exception $e);
}
文件 ② 观察者模式的自定义异常类 Observer_Exception
Observer_Exception.php:
<?php
class Observer_Exception extends Exception{
//保存观察者信息,静态属性
public static $_observer = array();
//添加观察者,静态方法
public static function attach(ExceptionObserver $observer){
//添加成员
self::$_observer[] = $observer;
} //重载父类的构造函数
public function __construct($message = null, $code = 0){
parent::__construct($message, $code);
$this->notify();
} //通知每一个观察者的方法
public function notify(){
foreach(self::$_observer as $observer){
$observer->update($this);
}
}
}
文件 ③ 观察者1.把异常信息记录到文件中
Log_Exception_Observer.php:
<?php
//观察者1.把异常记录到日志文件中
class Log_Exception_Observer implements ExceptionObserver{
protected $_filename = 'D:/practise/php/Error/LogException.log';
public function __construct($filename = null){
if($filename != null && is_string($filename)){
$this->_filename = $filename;
}
} public function update(Observer_Exception $e){
$message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
$message .= '信息:'.$e->getMessage().PHP_EOL;
$message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
$message .= '文件'.$e->getFile().PHP_EOL;
$message .= '行号'.$e->getLine().PHP_EOL;
error_log($message, 3, $this->_filename);
}
}
文件 ④ 观察者5.把异常信息通过邮件形式发送给管理员
Email_Exception_Observer.php:
<?php
//观察者2.把异常记录通过邮件形式发送
class Email_Exception_Observer implements ExceptionObserver{
protected $_email = '472323087@qq.com';
public function __construct($email = null){
if($email != null && filter_var($email, FILTER_VALIDATE_EMAIL)){
$this->_email = $email;
}
} public function update(Observer_Exception $e){
$message = '时间:'.date('Y-m-d H:i:s', time()).PHP_EOL;
$message .= '信息:'.$e->getMessage().PHP_EOL;
$message .= '追踪信息'.$e->getTraceAsString().PHP_EOL;
$message .= '文件'.$e->getFile().PHP_EOL;
$message .= '行号'.$e->getLine().PHP_EOL;
error_log($message, 1, $this->_email);
}
}
文件⑤ 测试文件
testObersver.php:
<?php
header('content-type:text/html; charset=utf-8'); require 'ExceptionObserver.php'; //接口
require 'Observer_Exception.php'; //观察者模式的自定义异常类
require 'Log_Exception_Observer.php'; //观察者1
require 'Email_Exception_Observer.php'; //观察者2 //添加观察者,把异常信息记录在文件中
Observer_Exception::attach(new Log_Exception_Observer());//不传参数则保存到默认的文件中 //自定义异常类
class MyException extends Observer_Exception{
public function test(){
echo '测试1:自定义方法处理异常';
}
} //测试
try{
throw new MyException('出现异常,记录');
}catch(MyException $e){
echo $e->getMessage();
echo '<hr>';
$e->test();
}
运行 testObersver.php,输出:

同时文件 LogException.log:

PHP 错误与异常 笔记与总结(15 )使用观察者模式处理异常信息的更多相关文章
- PHP 错误与异常 笔记与总结(10)错误处理器测试
关联文件:myErrorHandler.php (上一篇) 先测试通知级别的错误的自定义处理: testErrorHandler.php <?php require_once 'myErrorH ...
- C++ primer plus读书笔记——第15章 友元、异常和其他
第15章 友元.异常和其他 1. 友元类的所有方法都可以访问原有类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数.成员函数.或类为友元是由类定义的, ...
- PHP 错误与异常 笔记与总结(16 )自定义异常处理器
可以使用自定义异常处理器来处理所有未捕获的异常(没有用 try/catch 捕获的异常). set_exception_handler():设置一个用户定义的异常处理函数,当一个未捕获的异常发生时所调 ...
- 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记
友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有 ...
- 0040 Java学习笔记-多线程-线程run()方法中的异常
run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...
- java异常笔记
1:<java核心技术卷一>473页提到:如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的异常范围. 显然,如果子类中抛出的异常范围比超类还大.多态将无 ...
- 编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]
前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题, ...
- php错误以及常用笔记
//语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线分隔 // MIN_WIDTH 变量名建 ...
- java 检查抛出的异常是否是要捕获的检查性异常或运行时异常或错误
/** * Return whether the given throwable is a checked exception: * that is, neither a RuntimeExcepti ...
- 读书笔记 effective c++ Item 8 不要让异常(exceptions)离开析构函数
1.为什么c++不喜欢析构函数抛出异常 C++并没有禁止析构函数出现异常,但是它肯定不鼓励这么做.这是有原因的,考虑下面的代码: class Widget { public: ... ~Widget( ...
随机推荐
- stsadm.exe
Usage: stsadm.exe -o <operation> [<parameters>] stsadm.exe -help [<operation>] Ope ...
- ***php解析JSON二维数组字符串(json_decode函数第二个参数True和False的区别)
客户端的请求体中的数据:[{"msg_id": 1, "msg_status": "HAS_READ" }, { "msg_id& ...
- 浅谈K-SVD
由于工作需要,最近刚刚看了一些K-SVD的介绍,这里给自己做一下小节. K-SVD我们一般是用在字典学习.稀疏编码方面,它可以认为是K-means的一种扩展,http://en.wikipedia.o ...
- cocos2dx游戏开发——微信打飞机学习笔记(十)——碰撞检测的搭建
一.七说八说 大家都发现了= =,做了那么多,发现就是摆设,完全没有打飞机的感觉,没有实现碰撞的监测.比如说呢,子弹和敌机,玩家与敌机就是需要有碰撞检测的说,然后在这篇我想会很长很长的教 ...
- Android R文件相关问题
今天遇到的问题,gen下没有自动生成文件,而大部分java文件中错误是找不到R.java.“R cannot be resolved to a variable” 这就一定有别的原因造成错误, ...
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- Loadrunner模拟JSON接口请求进行测试
Loadrunner模拟JSON接口请求进行测试 一.loadrunner脚本创建 1.Insert - New step -选择Custom Request - web_custom_re ...
- Oracle生成千万测试数据
oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...
- WireShark抓包过程
wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了. 为了安全考虑 ...
- DOM--1 遵循最佳实践
为重用命名空间而进行规划 (function() { function $(id) { return document.getElementById(id); } function alertNode ...