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'用于辨别该错误是否是致命性错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能车复工日记【4】:关于图像的上下位机的调整问题总结

系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能车Code review】——坡道图像与控制处理 【智能车Code review】——拐点的寻找 【智能车Code review】——小S与中S道路判断 【智能车Code review】——环岛的判定与补线操作 智能车复工日记【1】——菜单索引…

设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能

染色动力学性能研究染色的什么问题?设计合理的实验方案来研究阳离子改性棉织物与未改性棉的染色动力学性能?并指出如何计算反映染色动力学的主要参数? 标准答案: 染色动力学研究染色速率问题。 为了研究阳离子改性棉纤维及未改性棉纤维对活性染料染色动力学性能,首先要测…

Java ArrayList toArray()方法及示例

ArrayList类的toArray()方法 (ArrayList Class toArray() method) Syntax: 句法&#xff1a; public Object[] toArray();public T[] toArray(T[] elements);toArray() method is available in java.util package. toArray()方法在java.util包中可用。 toArray() method is us…

小练习:新闻网站、SNS网站图片播放器jQuery版

新闻网站和sns网站常见的图片浏览器。直接看效果吧&#xff0c;效果预览&#xff1a;http://u.vps168.com.cn/cos2004/photoView/&#xff0c; ie7、ie8、ff预览正常&#xff0c;ie6和chrome预览有一点小问题&#xff0c;研究中 作者&#xff1a;绿色花园 出处&#xff1a;htt…

SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)

SQL SERVER的锁机制&#xff08;一&#xff09;——概述&#xff08;锁的种类与范围&#xff09; SQL SERVER的锁机制&#xff08;二&#xff09;——概述&#xff08;锁的兼容性与可以锁定的资源&#xff09; 本文上接SQL SERVER的锁机制&#xff08;三&#xff09;——概述&a…

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量?

如何测定拼色染液中,各染料在不同染色时间时,染液中残留染料量及织物上吸附上染的染料量? 标准答案: 通常依据各染料对特定波长光的吸光度具有加和性;吸光度值符合朗伯比尔定律,吸光度与浓度成正比;吸光度值分光光度计可以读出;通过联立方程,可以求出拼色各染料在染液中…

oracle云数据库 免费的吗,使用免费的Oracle云服务-创建ATP数据库

前面我们讲了在Oracle的云主机安装数据库&#xff0c;虽然现在安装数据库已经很简单了&#xff0c;但是真正要在生产环境使用&#xff0c;还是需要进行很多配置和优化的&#xff0c;这通常需要专业的人员。而ATP(自治事务性数据库服务)正是Oracle云提供的非常强大的数据库云服务…

golang判断结构体为空_如何在Golang中检查结构是否为空?

golang判断结构体为空The size of an empty structure is zero in Golang. Here, empty structure means, there is no field in the structure. 在Golang中&#xff0c; 空结构的大小为零。 在此&#xff0c; 空结构表示该结构中没有字段。 Eg: 例如&#xff1a; Type struc…

智能车复工日记【5】:起跑线的识别与车库入库

博主联系方式: QQ:1540984562 QQ交流群:892023501 群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。 系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能车Code review】——坡道图像与控制处理 【智能车Code re…

文本框只允许输入数字.net/javascript

<input type"text" name"test" onKeyUp"test1.value(this.valuethis.value.replace(/\D/g,).substring(0,6)).substring(0,3)" > <br /><input name"test1" type"text" > 用Up和Down有区别 只能输入数字、…

jquery全选,jquery全不选,jquery反选

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <title>全选&#xff0c;不…

obj[]与obj._Ruby中带有示例的Array.rassoc(obj)方法

obj[]与obj.Array.rassoc(obj)方法 (Array.rassoc(obj) Method) In this article, we will study about Array.rassoc(obj) method. You all must be thinking the method must be doing something which is related to the insertion of a certain element. It is not as simp…

oracle平均活动会话数,Oracle11g r2的活动会话数问题解决

如果你在Oracle11g r2的活动会话数的实际操作中&#xff0c;你对Oracle11g r2的活动会话数有不解之处时&#xff0c;你可以通过以下的文章对其的实际应用与功能有所了解&#xff0c;以下是文章的具体介绍&#xff0c;望你浏览完以下的内容会有所收获。在Oracle11g r2的活动会话…

请分析比较下列四种染料在相同浓度和相同温度的水染液中的聚集度大小?

请分析比较下列四种染料在相同浓度和相同温度的水染液中的聚集度大小? 标准答案: 染料聚集度从大到小的顺序为:3〉1〉4〉2 比较1-4染料结构差异,1、2共轭体系较短,3、4共轭体系较长,1、3磺酸基在端部,2、4磺酸基在中间; 染料3共轭体系长,范德华力大,而水溶性磺酸基团…

分割范围Codeforces Round #181 (Div. 2)

每日一贴,今天的内容关键字为分割范围 标题链接 A &#xff0c;B虽然是水题&#xff0c;但要是没想清晰就易容掉进某个坑里。。 C&#xff1a;预处理出有所可能的和&#xff0c;然后个每个每和分给a b两个数 D&#xff1a;竞赛的时候标题没看懂&#xff0c;题意就是说在一个n*n…

VC++动态链接库深入浅出(转)

1.概论  先来阐述一下DLL(Dynamic Linkable Library)的概念&#xff0c;你可以简单的把DLL看成一种仓库&#xff0c;它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库&#xff0d;静态链接库&#xff0d;动态链接库”的时代。 静态链接库与动态链…

智能车复工日记【6】:有bug的模糊PID记录

目录 系列文章DYY Warning算法参考链接:代码.c文件.h文件调用方法希望有大佬能帮我指正错误之处。以后假如有机会的话再搞这个模糊吧,头疼!!!系列文章 【智能车Code review】—曲率计算、最小二乘法拟合 【智能车Code review】——坡道图像与控制处理 【智能车Code review…

车刀 matlab,可转位车刀的结构

内容介绍原文档由会员 违规屏蔽12 发布摘 要随着有限元技术的快速发展&#xff0c;结构优化在航空航天、建筑、汽车、工程机械等领域的结构设计方面应用越来越广泛。在刀具行业中&#xff0c;新型刀具材料不断涌现&#xff0c;刀具的结构也在不断发展&#xff0c;目前针对刀具的…

DtCms.Model.Advertising.cs

using System; namespace DtCms.Model {/// <summary>/// 广告位实体类Advertising/// </summary>[Serializable]public class Advertising{public Advertising(){ }#region Modelprivate int _id;private string _title;private int _adtype;private string _adre…

分析染色温度对染色热力学性能和染色动力学性能的影响?实际生产时,染色温度选择应考虑哪些因素?举例说明?并阐明实现低温染色的原理。

分析染色温度对染色热力学性能和染色动力学性能的影响?实际生产时,染色温度选择应考虑哪些因素?举例说明?并阐明实现低温染色的原理。 答:染料的结构包括物理结构和化学结构,温度高低会影响染料结构,影响染料在染浴中的状态,染料的溶解、聚集、电离等性能,从而影响染…