php错误拦截机制,php拦截异常怎么写-PHP问题
php拦截异常可以通过PHP的错误、异常机制及其内建数'set_exception_handler'、'set_error_handler'、'register_shutdown_function' 来写。
首先我们定义错误拦截类,该类用于将错误、异常拦截下来,用我们自己定义的处理方式进行处理,该类放在文件名为'errorHandler.class.php'中,代码如下/**
* 文件名称:baseErrorHandler.class.php
* 摘 要:错误拦截器父类
*/
require 'errorHandlerException.class.php';//异常类
class errorHandler
{
public $argvs = array();
public $memoryReserveSize = 262144;//备用内存大小
private $_memoryReserve;//备用内存
/**
* 方 法:注册自定义错误、异常拦截器
* 参 数:void
* 返 回:void
*/
public function register()
{
ini_set('display_errors', 0);
set_exception_handler(array($this, 'handleException'));//截获未捕获的异常
set_error_handler(array($this, 'handleError'));//截获各种错误 此处切不可掉换位置
//留下备用内存 供后面拦截致命错误使用
$this->memoryReserveSize > 0 && $this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
register_shutdown_function(array($this, 'handleFatalError'));//截获致命性错误
}
/**
* 方 法:取消自定义错误、异常拦截器
* 参 数:void
* 返 回:void
*/
public function unregister()
{
restore_error_handler();
restore_exception_handler();
}
/**
* 方 法:处理截获的未捕获的异常
* 参 数:Exception $exception
* 返 回:void
*/
public function handleException($exception)
{
$this->unregister();
try
{
$this->logException($exception);
exit(1);
}
catch(Exception $e)
{
exit(1);
}
}
/**
* 方 法:处理截获的错误
* 参 数:int $code 错误代码
* 参 数:string $message 错误信息
* 参 数:string $file 错误文件
* 参 数:int $line 错误的行数
* 返 回:boolean
*/
public function handleError($code, $message, $file, $line)
{
//该处思想是将错误变成异常抛出 统一交给异常处理函数进行处理
if((error_reporting() & $code) && !in_array($code, array(E_NOTICE, E_WARNING, E_USER_NOTICE, E_USER_WARNING, E_DEPRECATED)))
{//此处只记录严重的错误 对于各种WARNING NOTICE不作处理
$exception = new errorHandlerException($message, $code, $code, $file, $line);
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_shift($trace);//trace的第一个元素为当前对象 移除
foreach($trace as $frame)
{
if($frame['function'] == '__toString')
{//如果错误出现在 __toString 方法中 不抛出任何异常
$this->handleException($exception);
exit(1);
}
}
throw $exception;
}
return false;
}
/**
* 方 法:截获致命性错误
* 参 数:void
* 返 回:void
*/
public function handleFatalError()
{
unset($this->_memoryReserve);//释放内存供下面处理程序使用
$error = error_get_last();//最后一条错误信息
if(errorHandlerException::isFatalError($error))
{//如果是致命错误进行处理
$exception = new errorHandlerException($error['message'], $error['type'], $error['type'], $error['file'], $error['line']);
$this->logException($exception);
exit(1);
}
}
/**
* 方 法:获取服务器IP
* 参 数:void
* 返 回:string
*/
final public function getServerIp()
{
$serverIp = '';
if(isset($_SERVER['SERVER_ADDR']))
{
$serverIp = $_SERVER['SERVER_ADDR'];
}
elseif(isset($_SERVER['LOCAL_ADDR']))
{
$serverIp = $_SERVER['LOCAL_ADDR'];
}
elseif(isset($_SERVER['HOSTNAME']))
{
$serverIp = gethostbyname($_SERVER['HOSTNAME']);
}
else
{
$serverIp = getenv('SERVER_ADDR');
}
return $serverIp;
}
/**
* 方 法:获取当前URI信息
* 参 数:void
* 返 回:string $url
*/
public function getCurrentUri()
{
$uri = '';
if($_SERVER ["REMOTE_ADDR"])
{//浏览器浏览模式
$uri = 'http://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
}
else
{//命令行模式
$params = $this->argvs;
$uri = $params[0];
array_shift($params);
for($i = 0, $len = count($params); $i < $len; $i++)
{
$uri .= ' ' . $params[$i];
}
}
return $uri;
}
/**
* 方 法:记录异常信息
* 参 数:errorHandlerException $e 错误异常
* 返 回:boolean 是否保存成功
*/
final public function logException($e)
{
$error = array(
'add_time' => time(),
'title' => errorHandlerException::getName($e->getCode()),//这里获取用户友好型名称
'message' => array(),
'server_ip' => $this->getServerIp(),
'code' => errorHandlerException::getLocalCode($e->getCode()),//这里为各种错误定义一个编号以便查找
'file' => $e->getFile(),
'line' => $e->getLine(),
'url' => $this->getCurrentUri(),
);
do
{
//$e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage() . '(' . $e->getCode() . ')'
$message = (string)$e;
$error['message'][] = $message;
} while($e = $e->getPrevious());
$error['message'] = implode("\r\n", $error['message']);
$this->logError($error);
}
/**
* 方 法:记录异常信息
* 参 数:array $error = array(
* 'time' => int,
* 'title' => 'string',
* 'message' => 'string',
* 'code' => int,
* 'server_ip' => 'string'
* 'file' => 'string',
* 'line' => int,
* 'url' => 'string',
* );
* 返 回:boolean 是否保存成功
*/
public function logError($error)
{
/*这里去实现如何将错误信息记录到日志*/
}
}
上述代码中,有个'errorHandlerException'类,该类放在文件'errorHandlerException.class.php'中,该类用于将错误转换为异常,以便记录错误发生的文件、行号、错误代码、错误信息等信息,同时其方法'isFatalError'用于辨别该错误是否是致命性错误。
php错误拦截机制,php拦截异常怎么写-PHP问题相关推荐
- springboot-No7 加入异常拦截机制ExceptionHandler
上一节我们介绍了如何使用 注解来标记需要校验,配合@Valid 进行 但是 如果校验住了那么 会抛出 org.springframework.validation.BindException 这个时候 ...
- Day75.Ajax、拦截器Interceptor、异常映射、自动|手动类型转换、类型校验
目录 一.Ajax ★ 1. 基本类型参数传递 @ResponseBody响应体 2. Ajax传递实体类 3.Ajax传递实体类带级联属性 (非json 普通参数) @DateTimeFormat ...
- 如何绕过chrome的弹窗拦截机制
如何绕过chrome的弹窗拦截机制 在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的.举个例子: var btn = $('#btn'); btn.click(fun ...
- Attribute在拦截机制上的应用
http://blog.csdn.net/niuyongjie/article/details/1295842 从这一节开始我们讨论Attribute的高级应用,为此我准备了一个实际的例子:我们有一个 ...
- PHP异常与错误处理机制
先区别一下php中错误 与 异常的概念吧 PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况.平时遇到的warming.notice ...
- 利用Windows的启动机制实现拦截360的运行
今天无意中发现一个漏洞,可以轻松干掉360,就是利用Windows的启动机制实现拦截360的运行.Windows中有一个叫做软件限制策略的功能,可以用来限制应用程序的运行,和IFEO比较像,只不过IF ...
- 事件分发机制 事件拦截 滑动冲突 MD
目录 事件分发机制分析案例 默认行为 试验 0 结论 dispatchTouchEvent 返回 true 试验 1 试验 2 结论 onInterceptTouchEvent 返回 true 试验 ...
- 反思|Android 事件拦截机制的设计与实现,android组件化开发
最顶层View直接持有最下层某个View的引用合理吗?答案是否定的.首先,这导致View层级依赖之间的混乱:其次,顶层View本身持有了最下层某个View的引用,则这之间若干个层级的View的targ ...
- Android短信拦截机制适配的坑(下)--4.4以上系统,主要是6.0
前一篇文章,Android短信拦截机制适配的坑(上)--4.4以下系统 介绍了广播接收的顺序,但是我明确说明在4.4以下系统,那么4.4及以上系统会遇到说明问题呢? 首先我们要来了解4.4系统短信的机 ...
最新文章
- 低通滤波器转带通滤波器公式由来_?OPA627AP 高通滤波器
- AES加密算法的详细简介
- Java协作开发,Java开发学习笔记之八:servlet之间的协作
- .NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
- 原生安卓苹果APP-java抢单派单系统平台源码
- binlog2sql使用总结
- leetcode - First Missing Positive
- “家乡好物直播”走进“水果第一县”,人大教授变身“好物推荐官”
- mongo go 查询指定字段_使用PyMongo查询MongoDB数据库!
- java 单链表是否有环_数据结构与算法随笔之链表-链表是否有环(二)
- 指针和字符串,数组和字符串(1)
- mac 下 word 2011 使用笔记
- Word 2010基本操作——新建文档、保存文档
- 使用PLC编程(ST语言)开发的DES加密解密功能块
- 51超声波测距简易代码
- Macbook怎么开启三指移动 ForceTouch TrackPad开启三指移动方法
- S-MAC协议的相关知识
- ESP32学习实例(四),WIFI模块的初步学习和遇到的问题,以及解决方法
- App开发之前的工作准备和开发中的一些流程
- win7 重装系统变 win10
热门文章
- input获得焦点和失去焦点
- 关于SSL证书配置、升级的一些问题总结
- 模态对话框和全选反选
- html5与css3入门知识点精炼
- MyBatis 入门到精通(二) SQL语句映射XML文件
- [Algorithm] 字符串匹配算法——KMP算法
- 用VBA去除Excel工作表保护密码
- 分数怎么化成带分数_人教版五年级下册第4单元带分数及把假分数化成整数或带分数教学视频+知识点...
- java 唯一索引冲突_JPA merge联合唯一索引无效问题解决方案
- php 数组对比 unset,如何区分PHP中unset,array_splice的区别