PHP学习笔记——错误处理

来源:互联网 发布:网络电影制作合同 编辑:程序博客网 时间:2024/05/22 14:21

PHP的错误处理

错误报告的级别

运行PHP脚本时,PHP解析器会尽其所能地报告其所遇到的问题。在PHP中错误报告的处理行为有PHP配置文件php.ini中相关的配置指令指定。PHP中有多个错误报告级别,可以通过设置错误报告级别,来控制错误报告的行为。

PHP中的 错误报告级别

级别常量 错误报告描述 E_ERROR 运行时的致命错误 E_WARNING 运行时警告(非致命错误) E_ PARSE 从语法中解析的错误 E_ NOTICE 运行时注意信息 E_ CORE_ERROR 类似E_ERROR但不包括PHP核心造成的错误 E_ CORE_WARNING 类似E_WARNING但不包括PHP核心错误警告 E_ USER_ERROR 用户导致的错误信息 E_ USER_WARNING 用户导致的警告信息 E_ NOTICE 用户导致的注意信息 E_ ALL 所有的错误,警告和注意 E_ STRICT 关于PHP版本一直和兼容性的操作性建议

开发人员希望在PHP脚本中显示某个级别 的错误时,必须先在php.ini文件中把display_error的值设置为On,开启错误报告功能。还可以通过ini_set()函数开启error_display

ini_set('display_error',1);//开启错误报告

注意:如果display_errors被启用,就会显示已满足设置级别的所有错误信息。但是,如果用户访问网站看到这些信息时,将会感到非常困惑。而且,泄露出来的服务器信息可能会给黑客利用,从而攻击网站。因此,在项目开发和调试期间,可以启用display_errors,但项目上线前,应把选择项设置为Off.

调整错误报告的级别

可以通过两种方法来该调整错误报告的级别:
1.修改配置文件php.ini
修改php.ini中,error_reporting的值,修改成功后,重启Web服务器,则每个PHP脚本都可以按调整后的错误级别输出错误报告。修改错误级别时,可以把位运算符(与、或、非)和错误级别常量一起使用。下面是示例:

;可以抛出任何非注意的错误error_reporting=E_ALL~E_NOTICE;只考虑运行时错误,解析错误和核心错误;error_reporting=E_ERROR|E_PARSE|E_CORE_ERROR;报告除用户错误之外的所有错误;error_reporting=E_ALL~(E_USER_ERROR|E_USER_WARNING|E_USER_NOTICE)

2.在PHP脚本中执行error_reporting()函数
可以在PHP脚本中执行error_reporting()函数,基于各个脚本,来设置错误报告级别。示例:

error_reporting(0)//关闭错误报告error_reproting(E_ALL);//将会向PHP报告每个错误

自定义错误处理

在开发的过程中,可以自定义错误的处理方式,完全绕过标准的PHP错误处理函数,这样可以按自己定义的格式打印错误报告。以下几种情况可以考虑使用自定义错误处理:

  • 记录错误信息,以及时发现一些生产环境出现的问题。
  • 用来屏蔽错误,避免把一些信息暴露给用户或者黑客
  • 做相应的错误处理,例如跳转到预先定义好的错误页面,提供更好的用户体验。

通常使用set_error_handler()函数去设置用户自定义的错误处理函数,该函数用于设置运行期间用户的错误处理方法。该函数有两个参数,第一个是必须的,需要一个回调函数,规定发生错误时运行的函数。而这个回调函数需要设置四个参数,否则无效,按顺序分别是:错误等级、错误信息、错误文件、错误行号。set_error_handler()函数的第二个参数是可选的,用于规定哪个错误报告级别会显示用户自定义的错误。默认是”E_ALL”。示例:

<?phperror_reporting(0);/**    错误处理函数,作为set_eror_handler()函数的第一个参数”回调“    @parm   int     $error_level   错误级别    @parm   string  $error_message 错误信息    @parm   string  $error_file        错误所在文件    @parm   int     $error_line        错误所在行数**/function error_handler($error_level,$error_message,$file,$line){    $EXIT=FALSE;    switch($error_level){        case E_NOTICE:            $error_type='Notice';            break;        case E_WARNING:            $error_type='Warning';            break;        case E_USER_WARNING:            $error_type='User Warning';            break;        case E_ERROR:            $error_type='Error';            break;        case E_USER_ERROR:            $error_type='User Error';            $EXIT=TRUE;            break;        case E_PARSE:            $error_type='User Error';            $EXIT=TRUE;            break;        default:            $error_type='unknow';            $exit=TRUE;    }    echo $error_type. ' in line'. $line.'<br>';    if($EXIT==TRUE)        //跳转到另一个脚本}    set_error_handler('error_handler');    echo $novar;//使用未定义变量,报notice    echo 3/0;//除以0,报Warning    trigger_error('triger error',E_USER_ERROR);//自己定义一个错误?>

运行结果如图所示:
运行结果

所有的打印错误都是按照自己定义的格式输出的(当然,你完全可以不把错误的类型以及出现的位置显示出来),不过有一点,系统直接报Fatal Error这里捕获不到,因为系统不会把这么重大的错误交给你处理。除此之外,E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的。另外,使用set_error_handler()函数后,所有的错误都会交给自定义的函数处理。

使用set_error_handler()函数可以使错误提示更加美观,配合网站的风格,使用户界面更加友好。

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办 钱付了货没收到怎么办 在苏宁易购上买东西地址错了怎么办 手机分期付款银行卡丢了怎么办 华硕笔记本鼠标不动了怎么办 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办 银座购物卡丢失后怎么办 银座的卡丢了怎么办 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办 网贷到家来要钱怎么办 网贷贷不了啦急要钱怎么办 百度推广竞价关键词太长怎么办 药店位置差客流少怎么办 网站上的用词违规怎么办 苹果16g内存不够怎么办 手机16g内存不够怎么办 在私企年纪大了怎么办 谷歌浏览器显示不安全打不开怎么办 4s密码多次错误怎么办 苹果4s手机系统错误怎么办 汽车充电口坏了怎么办 如果手机充不了电怎么办 淘宝买的家电坏了怎么办 衣服皱了没有熨斗怎么办 油烟机油盒坏了怎么办