PHP自定义错误处理的方法分析


Posted in PHP onDecember 19, 2018

本文实例讲述了PHP自定义错误处理的方法。分享给大家供大家参考,具体如下:

自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按照自己定义的格式打印错误报告,或改变错误报告打印的位置(标准PHP的错误报告是哪里发生错误就在发生位置处显示)。以下几种情况可以考虑自定义错误处理。

★可以记下错误的信息,及时发现一些生产环境出现的问题。

★可以用来屏蔽错误。出现错误会把一些信息暴漏给用户,极有可能成为黑客攻击你网站的工具。

★可以做相应的处理,将所有错误报告放到脚本最后输出,或出错时可以显示跳转到预先定义好的出错页面,提供更好的用户体验,如果必要,还可以在自定义错误处理程序中,根据情况去终止脚本运行。

★可以作为调试工具,一些时候必须在运行环境时调试一些东西,但又不想影响正在使用的用户。

通常使用set_error_handler()函数去设置用户自定义的错误处理函数,该函数用于创建运行时期间的用户自己的错误处理方法,返回旧的错误处理程序,若失败,则返回null。该函数有两个参数,其中第一个参数是必选的,需要一个回调函数,规定发生错误时运行的函数。这个回调函数一定要声明4个参数,否则无效,按顺序分别为“是否存在错误”、“错误信息”、“错误文件”和“错误行号”。set_error_handler()函数的第二个参数则为可选的,规定现在哪个错误报告级别会显示用户自定义的错误。默认是“E_ALL”。自定义错误处理的示例如下所示:

<?php
error_reporting(0); //屏蔽程序中的错误
//定义Error_Handler函数,作为set_error_handler()函数的第一个参数“回调”
function error_handler($error_level,$error_message,$file,$line){
$EXIT =FALSE;
switch($error_level){
//提醒级别
case E_NOTICE:
case E_USER_NOTICE:
$error_type = 'Notice';
break;
//警告级别
case E_WARNING:
case E_USER_WARNING:
$error_type='warning';
break;
//错误级别
case E_ERROR:
case E_USER_ERROR:
$error_type='Fatal Error';
$EXIT = TRUE;
break;
//其他未知错误
default:
$error_type='Unknown';
$EXIT = TRUE;
break;
}
//直接打印错误信息,也可以写文件,写数据库,反正错误信息都在这,任你发落
printf("<font color='#FF0000'><b>%s</b></font>:%s in<b>%s</b> on line <b>%d</b><br>\n",$error_type, $error_message, $file, $line);
//如果错误影响到程序的正常执行,跳转到友好的错误提示页面
if (TURE==$EXIT){
echo '<script>location = "err.html";</scrpit>';
}
}
//这个才是关键点,把错误的处理交给error_handle()
set_error_handler('error_handler');
//使用未定义的变量要报notice的
echo $novar;
//除以0要报警告的
echo 3/0;
//自定义一个错误
trigger_error('Trigger a fatal error',E_USER_ERROR);
?>

本例所有打印的错误报告都是按自己定义的格式输出的,不过有一点,系统直接报Fatal Error的这里捕获不到,因为系统不可能把这么重大的错误教给你处理。遇到这种错误是必须要解决的,所以系统会直接终止程序运行。使用set_error_handler()函数可以很好地解决安全和调试方便的矛盾,而且你还可以花点心思,使错误提示更加美观以配合网站的风格。不过要注意两点。

E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING是不会被这个句柄处理的,也就是会用最原始的方式显示出来。不过出现这些错误都是编译或PHP内核出错,在通常情况下不会发生。

②使用set_error_handler()后,error_reporting()将会失效。也就是所有的错误(除上述的错误)都会教给自己定义的函数处理。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
PHP在特殊字符前加斜杠的实现代码
Jul 17 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php通过修改header强制图片下载的方法
Mar 24 PHP
php实现可运算的验证码
Nov 10 PHP
CI框架中类的自动加载问题分析
Nov 21 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
YII框架http缓存操作示例
Apr 29 PHP
PHP命名空间用法实例分析
Sep 04 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
PHP异常类及异常处理操作实例详解
Dec 19 #PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
Dec 18 #PHP
PHP时间戳和日期相互转换操作实例小结
Dec 18 #PHP
PHP获取星期几的常用方法小结
Dec 18 #PHP
php往mysql中批量插入数据实例教程
Dec 12 #PHP
yii2 url重写并隐藏index.php方法
Dec 10 #PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 #PHP
You might like
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
transport.js和jquery冲突问题的解决方法
2015/02/10 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
利用js canvas实现五子棋游戏
2020/10/11 Javascript
[38:51]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-CDEC
2014/05/22 DOTA
详细介绍Python语言中的按位运算符
2013/11/26 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
学校节能减排倡议书
2014/05/16 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
企业文化标语大全
2014/06/10 职场文书
中学生综合素质自我评价
2015/03/06 职场文书
2014年度个人总结范文
2015/03/09 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL