错误处理
1.概念:
系统在对某些代码执行的时候,发现有错误,就会通过错误处理的形式来告知程序员。
2.错误分类
(1)、语法错误:用户书写的代码不符合PHP的语法规范。会导致编译不通过(Parse error)
(2)、运行时错误:代码编译通过,但是在执行过程中会出现一些条件不满足导致的错误(runtime error)
(3)、逻辑错误:代码不够规范,出现了一些逻辑错误,导致代码正常执行,却得不到想要的结果。
最常见的就是把比较符号写成了逻辑符号
3.错误代号
注意:所有的错误代码在PHP中都被定义成系统常量(可以直接使用)
(1)、系统错误
E_PARSE:编译错误,代码不执行。
E_ERROR:fatal error,致命错误,代码会在出错的位置不再执行。
E_WARNING:warning,警告错误,不影响代码执行,但可能得到意想不到的结果。
E_NOTICE:notice,通知错误,不影响代码执行,影响美观。
(2)、用户错误:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用的代码错误(系统不会用到)
(3)、其他错误:
E_ALL:代表所有错误,通常在进行错误控制时使用比较多,建议在开放过程(开放环境)使用。
所以以E开头的错误常量都是由一个字节存储的,然后每一种错误占据一个对应的位,如果想要进行一些错误的控制,可以进行位运算进行操作。
排除通知级别notice:E_ALL& ~E_NITICE
只有警告和通知:E_WARNING | E_NOTICE
4.错误触发
程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,并反馈给用户,主要针对代码的语法错误和运行时错误
人为触发:知道某些逻辑可能会出错,而使用对应的判断代码来触发错误提升
trigger_error(错误提示):
<?php
header("content-type:text/html;charset=utf-8");
$a=10;
$b=0;
if($b==0){
trigger_error("除数不能为0");
}
echo $a/$b;
?>
输出
默认为notice,代码会继续执行,但是可以使用error,代码不会继续执行,看下面截图
5.错误显示设置
错误显示设置:哪些错误需要显示,该如何显示。
在PHP中,其实有2种方式来设置当前脚本的错误处理。
(1)、php的配置文件,全局配置;php.ini文件。
display_errors:是否显示错误
error_reporting:显示什么级别的错误
(2)、可以在php运行的脚本中去设;在脚本中配置项级别比配置文件高,前提是该脚本得运行。(通常在开发当中都会在代码中去进行控制)
error_reporting():可以设置对应的错误显示级别。
ini_set(‘配置文件中的配置项’,配置值)
如ini_set(‘error_reporting’,E_ALL)
ini_set(‘display_errors’,1) ;1就是开启的意思。
6.错误日志设置
在实际生产环境中,不会直接让错误赤裸裸的展示给用户看。
(1)、不友好
(2)、不安全,错误会暴露网站很多信息(路径,文件名)
所以在生产环境中一般不会显示错误(错误比较少),但是不可避免会出现错误(测试时未体现的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改,需要保存到日志文件中,需要在php配置文件中或代码(int_set)中设置对应的error_log配置项
开启日志功能
指定路径
7.自定义错误处理
最简单的错误处理:tigger_error()函数,但是该系统不会阻止系统报错。
PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加在系统错误处理的句柄中,然后系统遇到错误之后,使用用户定义的错误函数。
(1)、如何将用户自定义的函数放到系统中呢?set_error_handle()
代码实现,
自定义错误处理函数,注意参数。
<?php
header("content-type:text/html;charset=utf-8");
//自定义函数
/*
@param1 $errno是系统提供的错误代码:$E_ALL,E_NOTICE...
*/
function my_error($errno,$errstr,$errfile,$errline){
//判断:当前会碰到错误有哪些
if(!(error_reporting() & $errno)){
//排除本身系统就要排除的错误
return false;
//error_reporting没有参代表获取当前系统错误处理对应的级别
}
//开始判断错误类型
switch ($errno) {
case E_ERROR:
case E_USER_ERROR:
echo 'fatal error in file'.$errfile.'on line'.$errline.'<br/>';
echo 'error info:'.$errstr;
break;
case E_WARNING:
case E_USER_WARNING:
echo 'Warning in file'.$errfile.'on line'.$errline.'<br/>';
echo 'error info:'.$errstr;
break;
case E_NOTICE:
case E_USER_NOTICE:
echo 'Notice in file'.$errfile.'on line'.$errline.'<br/>';
echo 'error info:'.$errstr;
break;
}
return true;
}
//报错
echo $a;
//修改错误机制
echo '<hr/>';
set_error_handler('my_error');
echo $a;
?>
输出
当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定的界面。