错误处理
错误的分类
- 语法错误:程序无法运行直接提示语法错误
- 运行时错误(主要错误):程序运行到某行不满足要求(类似未定义变量)出现的错误
- 逻辑错误:程序从头到尾运行无错误但结果错误,不符合逻辑
错误的分级
在PHP中,将各种错误依据不同的严重程度和产生的来源分为大约10几个级别,每个级别的错误对应一个内部的名称--系统常量
系统错误:
E_ERROR:系统严重错误,一旦发生程序立即停止执行
E_WARNING:系统警告,一发生,提示错误并继续执行
E_PARSE:语法错误,一发生提示错误,代码完全不运行
E_NOTICE:系统提示,一发生提示错误并继续执行
可见,这些系统错误只是一个系统内部常量(整数常量):实际上,这些常量(代号)是供我们对该类错误进行控制的标识符而已
用户自定义错误
只有3个:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
这些错误用于我们创建--为了针对某些数据的不合理情形而创建的错误
比如:用户填写年龄,当用户填写188就是不合理,可归为用户自定义错误
其他
E_ALL:代表所有错误--表示它可以“包括”错误
E_STRICT:代表“严格性”语法检查错误--某种语法可以执行,但在当前的PHP版本中已过时
错误的触发
正常触发
程序确实发生了运行错误--也可能是语法检查错误
3种常见的运行时错误
人工触发
有程序员通过程序代码产生一个错误
语法:trigger_error("错误提示",用户错误代号);
应用中判断数据的有效性,已决定是否触发相应错误
错误的显示控制
网页中显示(提示)错误信息是可以进行控制的,有两种途径:
1,在php.ini文件中设定,对所有PHP程序都有效
2,在当前脚本文件中,只对当前脚本文件有效
错误的显式有两个方面进行控制
php.ini中,display_errors = On; //表示显示,off表示不显示
显示
脚本中:ini_set("display_errors",1) //表示显示,off表示不显示,且脚本的设定优先级搞
php.ini文件中:
error_reporting=E_NOTICE; //只显示E_NOTICE的错误
error_reporting=E_NOTICE | E_WARNING; //显示E_NOTICE和E_WARNING的错误
error_reporting=E_NOTICE | E_WARNING | E_USER_ERROR; //显示E_NOTICE和E_WARNING和E_USER_ERROR的错误
解释上一行:
- 设定是否显示:display_errors;
- 设定显示哪些级别的错误--依赖于前者的显示
E_NOTICE: 0000000000001000
E_WARNING: 0000000000000010
E_USER_ERROR 0000000100000000
或运算(|)
————————————————————————————————————
0000000100001010
实际上,在开发阶段,常用:error_reporting = E_ALL | E_STRICT.结果如下:
E_ALL 0111011111111111
E_STRICT 0000100000000000
或运算(|)
——————————————————————————————————————
0111111111111111
可见只有E_ALL并非“所有”,两者加起来才表示所有
在代码中设定:
ini_set("error_reporting",E_NOTICE);
ini_set("error_reporting",E_NOTICE | E_WARNING | E_USER_ERROR);
另一个对应函数:ini_get("设定项名称");
记录错误日志
在开发阶段:我们通常都是显示所有错误--意图解决错误
在产品阶段:我们通常都是隐藏所有错误--并同时将错误信息记录到文件中--错误日志文件(程序员可以查看错误解决方案)
记录的两种途径:
1,在php.ini文件中设定
log_errors = On; //测定是否记录错误日志
error_log = "错误日志名" //设定错误日志文件名
此时该文件没有给定路径,则系统会在对应文件目录下建立该文件并记录
可见,页面中显示的错误提示内容与日志中的错误提示内容一样
error_log还有一个特殊值可以使用:error_log = syslog //此时不会记录错误日志文件,而是把错误日志记录到系统日志中
结果为:
事件查看器位置:
控制面板》管理工具(以大图标为查看方式)》事件查看器
2,在脚本中设定
Ini_set(“log_errors”,On); //或者off
Ini_set(“error_log”,“error1.log”); //文件名后缀识随便
Ini_set(“error_log”,“error2.text”);
Ini_set(“error_log”,syslog); //记录到操作系统日志
自定义错误处理
前面的错误处理,归根结底只是将记录的位置改变。但是,自定义错误处理,可以让我们自己控制错误的提示内容
做法非常简单:
- 设定用来自定义错误处理的自定义函数名
- 自己定义该函数,并在其中进行任何错误信息的输出
做好后,系统一旦发生错误就会调用该函数执行其中的代码
测试以下代码:
结果显示:
说明:
- 一旦使用自定义错误处理程序,则系统不再处理错误
- 但:如果一旦发生严重错误(E_ERROR,E_USER_ERROR),则立即停止程序并也不调用自定义函数进行错误提示--其他错误处理能照样进行
- 在php.ini文件中设定;
- 在脚本中设定