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问题相关推荐

  1. springboot-No7 加入异常拦截机制ExceptionHandler

    上一节我们介绍了如何使用 注解来标记需要校验,配合@Valid 进行 但是 如果校验住了那么 会抛出 org.springframework.validation.BindException 这个时候 ...

  2. Day75.Ajax、拦截器Interceptor、异常映射、自动|手动类型转换、类型校验

    目录 一.Ajax ★ 1. 基本类型参数传递  @ResponseBody响应体 2. Ajax传递实体类 3.Ajax传递实体类带级联属性 (非json 普通参数) @DateTimeFormat ...

  3. 如何绕过chrome的弹窗拦截机制

    如何绕过chrome的弹窗拦截机制 在chrome的安全机制里面,非用户触发的window.open方法,是会被拦截的.举个例子: var btn = $('#btn'); btn.click(fun ...

  4. Attribute在拦截机制上的应用

    http://blog.csdn.net/niuyongjie/article/details/1295842 从这一节开始我们讨论Attribute的高级应用,为此我准备了一个实际的例子:我们有一个 ...

  5. PHP异常与错误处理机制

    先区别一下php中错误 与 异常的概念吧 PHP错误:是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况.平时遇到的warming.notice ...

  6. 利用Windows的启动机制实现拦截360的运行

    今天无意中发现一个漏洞,可以轻松干掉360,就是利用Windows的启动机制实现拦截360的运行.Windows中有一个叫做软件限制策略的功能,可以用来限制应用程序的运行,和IFEO比较像,只不过IF ...

  7. 事件分发机制 事件拦截 滑动冲突 MD

    目录 事件分发机制分析案例 默认行为 试验 0 结论 dispatchTouchEvent 返回 true 试验 1 试验 2 结论 onInterceptTouchEvent 返回 true 试验 ...

  8. 反思|Android 事件拦截机制的设计与实现,android组件化开发

    最顶层View直接持有最下层某个View的引用合理吗?答案是否定的.首先,这导致View层级依赖之间的混乱:其次,顶层View本身持有了最下层某个View的引用,则这之间若干个层级的View的targ ...

  9. Android短信拦截机制适配的坑(下)--4.4以上系统,主要是6.0

    前一篇文章,Android短信拦截机制适配的坑(上)--4.4以下系统 介绍了广播接收的顺序,但是我明确说明在4.4以下系统,那么4.4及以上系统会遇到说明问题呢? 首先我们要来了解4.4系统短信的机 ...

最新文章

  1. 低通滤波器转带通滤波器公式由来_?OPA627AP 高通滤波器
  2. AES加密算法的详细简介
  3. Java协作开发,Java开发学习笔记之八:servlet之间的协作
  4. .NET Core ORM 类库Petapoco中对分页Page添加Order By对查询的影响
  5. 原生安卓苹果APP-java抢单派单系统平台源码
  6. binlog2sql使用总结
  7. leetcode - First Missing Positive
  8. “家乡好物直播”走进“水果第一县”,人大教授变身“好物推荐官”
  9. mongo go 查询指定字段_使用PyMongo查询MongoDB数据库!
  10. java 单链表是否有环_数据结构与算法随笔之链表-链表是否有环(二)
  11. 指针和字符串,数组和字符串(1)
  12. mac 下 word 2011 使用笔记
  13. Word 2010基本操作——新建文档、保存文档
  14. 使用PLC编程(ST语言)开发的DES加密解密功能块
  15. 51超声波测距简易代码
  16. Macbook怎么开启三指移动 ForceTouch TrackPad开启三指移动方法
  17. S-MAC协议的相关知识
  18. ESP32学习实例(四),WIFI模块的初步学习和遇到的问题,以及解决方法
  19. App开发之前的工作准备和开发中的一些流程
  20. win7 重装系统变 win10

热门文章

  1. input获得焦点和失去焦点
  2. 关于SSL证书配置、升级的一些问题总结
  3. 模态对话框和全选反选
  4. html5与css3入门知识点精炼
  5. MyBatis 入门到精通(二) SQL语句映射XML文件
  6. [Algorithm] 字符串匹配算法——KMP算法
  7. 用VBA去除Excel工作表保护密码
  8. 分数怎么化成带分数_人教版五年级下册第4单元带分数及把假分数化成整数或带分数教学视频+知识点...
  9. java 唯一索引冲突_JPA merge联合唯一索引无效问题解决方案
  10. php 数组对比 unset,如何区分PHP中unset,array_splice的区别