错误处理
系统或用户在某些代码进行执行的时候,发现有错误,会通过错误处理的形式告知程序员。
错误分类
1、语法错误:
用户书写的代码不符合PHP的语法规范,会导致代码在编译过程中不通过,代码不执行(parse error)
2、运行时错误:
代码编译通过,但是代码在执行过程中会出现一些条件不满足,导致的错误(runtime error)
3、逻辑错误:
程序员在写代码的时候不够规范,出现了逻辑上的错误,代码可以正常执行,但是得不到想要的结果。
错误代号
所有看到的错误代码在PHP中都被定义成了系统常量,可以直接 访问/使用
1、系统错误:
E_PARSE:编译错误,系统不执行;
E_ERROR:fatal error,致命错误,代码不能正确继续执行(出错的位置断掉);
E_WARNING:警告错误,不影响代码执行,但是可能得到意想不到的结果;
E_NOTIC:通知错误,不会影响代码执行。
2、用户错误
E_USER_RROR,E_USER_WARNING,E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
3、其他
E_ALL:代表着所有错误(通常在进行错误控制的时候比较多),建议在开发环境中使用。
所有以E开头的错误常量(代号),其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作。
排除通知级别notice:E_ALL & ~E_NOTICE;
只要警告和通知:E_WARNING | E_NOTICE;
错误触发:
程序运行时触发:
系统自动根据错误发生后,对比对应的错误信息,输出给用户:只要针对代码的语法错误和运行时错误;
人为触发:
知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示:
trigger_error(错误提示);
可以通过第二个参数进行严格性控制。
错误显示设置:
设置哪些错误该显示,以及如何显示;
在PHP中,有两种方式设置当前脚本的错误处理
1、PHP配置文件:全局配置:PHP.ini
Display_errors:是否显示错误
error_reporting:显示什么级别的错误
2、在运行的PHP脚本中设置,在脚本中定义的配置级别比配置文件高(通常在开发中会用代码去进行控制和配置)
error_reporting():设置错误显示级别;
ini_set('配置文件中的配置项',配置值);
ini_set('error_reporting',E_ALL);
ini_set('display_error',1);
错误日志设置
在实际生产环境中,不会把错误展示给用户:
1、不友好
2、不安全,会暴露网站很多信息(路径、文件名、规则)
所以在生产环境中,一般不显示错误,但是不可避免会出现错误(测试中未发现的问题),这个时候需要保留错误信息让后台修改,就把错误信息保存在日志文件中。
需要在PHP配置文件中或者代码中(ini_set)设置对应的error_log配置项:
I、开启日志功能
ini_set('log_errors',on);
II、指定路径
如:error_log = 'G:/wamp64/www/errlog/php_errors.log'
自定义错误处理
PHP自定错误处理函数,然后将该函数增加到系统错误处理的句柄中。系统会在碰到错误之后,使用用户自定义的错误函数。
1、将自定义函数加入系统中
set_error_handler();
2、自定义错误处理函数,系统的要求:
errno、errstr两个参数必须存在;
errfile、errline、errcontext 属于可选参数,取决于自定义函数是否需要该参数。
代码实现:
1、自定义错误处理函数(注意参数)
<?php
//自定义函数
function my_error($errno,$errstr,$errline){
//判断:当前会碰到的错误有哪些
if(!(error_reporting() & $errno)){ //判断错误类型,是否是被系统排除的错误
return false;
}
//开始判断错误类型
switch($errno){
case E_ERROR: //错误匹配
case _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 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 ture;
}
2、注册自定义函数:修改错误处理机制
set_error_hander('函数名'); 例set_error_hander('my_error');
当前属于简单的自定义模式,还可以设置错误发生后跳转