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( ...
随机推荐
- NSOperation基本使用
NSOperation简单介绍 a. 是OC语言中基于GCD的面向对象的封装 b. 使用起来比GCD更加简单(面向对象) c. 提供了一些用GCD不好实现的功能 d. 苹果推荐使用,使用NSOper ...
- 类似于fopen与fopen64的种种情况
在Linux和unix系统中,我们会遇到¥和¥64的情况.比如stat64,fopen64等 fopen64是linux特有 的,fopen64()函数和fopen()函数相同的,只是底层的文件描述符 ...
- Maven打包部署脚本
#!/bin/sh SVN_USER_NAME= SVN_PASSWORD= ROOT_PATH PROJECT_NAME ACTION SVN_LIB_ROOT USER_ACCOUNT PASSW ...
- 好用的PHP分页类
<?php class Page { private $total; //总记录 private $pagesize; //每页显示多少条 private $limit; ...
- hdu 4292 最大流 水题
很裸的一道最大流 格式懒得排了,注意把人拆成两份,一份连接食物,一份连接饮料 4 3 3 //4个人,3种食物,3种饮料 1 1 1 //食物每种分别为1 1 1 1 //饮料每种数目分别为1 YYN ...
- 谷歌开源项目Chromium的源码获取与项目构建(Win7+vs10/vs13)
转自:http://blog.csdn.net/kuerjinjin/article/details/23563059 从12年那会儿开始获取源码和构建chromium项目都是按照那时候的官方要求用w ...
- matlab练习程序(构造简单多边形)
简单多边形是指各边不相交的多边形. 首先计算出所有顶点中心位置. 然后求每个顶点与中心的极角. 再对极角进行排序. 连接排序后的点就行了. 结果如下: matlab代码如下: clear all;cl ...
- hud 1785 畅通工程
#include<iostream> #include<stdio.h> #include<algorithm> #include<math.h> us ...
- java 线程的几种状态
java thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...
- js:语言精髓笔记8--对象系统
封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...