错误处理的方式有三种
One:显示错误报告
Two:记录错误日志(不将错误信息输出的标准输出,而是写到某个文件内)
上面两种php系统自动支持的错误处理方式。
Three:采用用户自定义的错误处理器,处理错误。
显示错误报告:
通过下面的错误配置信息完成
Error_reporting: 需要报告的错误级别
Display_errors::是否显示错误信息
可以通过修改php.ini完成,也可以在用户的php脚本内完成(ini_set()函数),但是只针对当前脚本有效。
通过Ini_set();函数,可以设置配置信息(不是所有的配置信息都支持在脚本内设定,但当前这两个是支持的)
语法:
Ini_set(‘需要设置的配置项’, ‘设置的值’);
例如:
不显示所有的错误:
<span style="font-size:18px;"><?php
ini_set('display_errors', '0');//第二个参数设置为0表示不显示错误
$n=9;
if($n<10){
trigger_error('不能小于10',E_USER_NOTICE);
trigger_error('不能小于10',E_USER_WARNING);
trigger_error('不能小于10',E_USER_DEPRECATED);
}
?></span>
有选择性的显示错误:
<span style="font-size:18px;"><?php
ini_set('error_reporting',E_ALL & ~E_USER_DEPRECATED);//除了E_USER_DEPRECATED错误,其他错误出现了都会显示
ini_set('display_errors', '1');//第二个参数设置为1表示显示错误
$n=9;
if($n<10){
trigger_error('不能小于10',E_USER_NOTICE);
trigger_error('不能小于10',E_USER_WARNING);
trigger_error('不能小于10',E_USER_DEPRECATED);
}
?></span>
记录错误日志:
在生成环境(web服务器上)。
通过php的配置完成(php.ini):
Error_log 指向当前需要记录错误的日志文件
Log_errors 是否记录日志
同样 配置可以在用户脚本修改
<span style="font-size:18px;"><?php
ini_set('error_reporting',E_ALL);
ini_set('display_errors', '0');
ini_set('error_log','D:\test_error');//会自动生成test_error文件
ini_set('log_errors','1');
$n=9;
if($n<10){
trigger_error('不能小于10',E_USER_NOTICE);
trigger_error('不能小于10',E_USER_WARNING);
trigger_error('不能小于10',E_USER_DEPRECATED);
}
?></span>
注意,日志同样受error_reporting中的级别影响。如果Error_log不设置(log_errors还是设置为1),采用Apache的错误日志记录错误信息。如果Error_log的值设置为‘Syslog’ ,那么错误会记录在当前操作系统的日志内。
还可以手动,通过用户脚本,将错误信息,记录到日志内。
利用 php函数 error_log()来完成。
<span style="font-size:18px;"><?php
ini_set('error_reporting',E_ALL);//除了E_USER_DEPRECATED错误,其他错误出现了都会显示
ini_set('display_errors', '1');//第二个参数设置为1表示显示错误
ini_set('error_log','D:\test_error');
ini_set('log_errors','1');
$n=9;
if($n<10){
error_log('n不能小于10');//错误信息会被记录到日志中
}
?></span>
自定义错误处理器:
利用php的系统函数,可以将某个回调函数结构,设置成错误处理器。
一旦设置成功,不会使用系统的错误处理方法,来处理,而是采用用户自定的函数过程来处理。
除非,用户自定义的错误处理函数,返回false。 返回false说明 在自定义处理完毕后,会将错误再交由默认的系统处理器处理。
<span style="font-size:18px;"><?php
ini_set('error_reporting',E_ALL);
ini_set('display_errors', '1');
ini_set('error_log','D:\test_error');
ini_set('log_errors','1');
set_error_handler('hand');
function hand($errno,$errmsg,$errfile,$errline){
var_dump($errno,$errmsg,$errfile,$errline);
return false;
}
echo $a;
?></span>
回调函数里面的处理方式,可以根据不同的需要填写,例如将错误存到数据库,或者根据不同的错误级别设置处理方式。回调函数还可以是一个类的静态方法,或者是一个对象的方法,形式多样。