错误处理指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。
错误代号
所有看到的错误代码在PHP中都被定义成了系统常量(可以直接使用)
1、系统错误:
E_ERROR:fatal error 致命错误,出错的位置断掉
E_PARSE:编译错误,代码不会执行
E_WARNING:warning 警告错误
E_NOTICE:notice 通知错误
2、用户错误:
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
3、E_ALL 代表着所有错误
错误显示设置
哪些错误该显示,以及该如何显示
在PHP中,其实有两种方式来设置当前脚本的错误处理
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);
自定义错误处理
最简单错误处理:trigger_errors(),但是该函数不会阻止系统报错
$a = 100;
$b = 0;
if ($b == 0) {
trigger_error("除数不能为0"); //默认notice,会继续执行
trigger_error("除数不能为0!", E_USER_ERROR); //E_USER_ERROR-致命错误,代码立刻停止执行
}
echo $a / $b;
自定义错误处理函数
PHP系统提供了一种用户处理错误的机制:
用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数,自己写函数,接管所有错误。
1、用户自定义函数格式
function my_error($errno, $errstr, $errfile, $errline){}
$errno → 错误号(E_WARNING、E_NOTICE...)
$errstr → 错误信息
$errfile → 错误所在文件
$errline → 错误所在行号
error_reporting(...) --它是一个开关集合,不是触发条件
两种用法:
1、告诉 PHP 要报哪些错
error_reporting( 你要开启的错误 );
//开启所有错误
error_reporting(E_ALL);
//开启所有错,但忽略通知
//~ 就是 “排除、去掉、不要” 的意思
error_reporting(E_ALL & ~E_NOTICE);
//只开启警告
error_reporting(E_WARNING);
//关闭所有错误
error_reporting(0);
2、获取 → 拿到当前开启了哪些错
$current = error_reporting();
如果你从头到尾没写过任何 error_reporting()
那它用的是 php.ini 里的默认配置
可以输入phpinfo();打开网页查找
或者直接输入
echo error_reporting();//查看错误级别
PHP的错误处理过程:
1、先代码报错-抛出一个错误号(整数)
2、error_reporting()拿到当前开启的错误集合(一个数字)可能是一个错误的单个数字,可能是多个错误的相加数字
3、然后用&或|做二进制运算
function my_error($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
//没有参数代表获取当前系统错误处理对应的级别
return false;
}
}
PHP中的错误处理的按位与&是用来计算二进制,而不是判断,&&逻辑或才是用来判断的
error_reporting ()是存放多个错误的,不存放多个变量,用一个数字代表N个错误组合
在PHP中的错误处理,每一个错误都有一个数字,例如:
E_ERROR = 1
E_WARNING = 2
E_PARSE = 4
E_NOTICE = 8
E_ALL = 很多数加在一起
PHP的错误处理里面的&和|虽然都是位运算,但是用的场景不一样,但在 PHP 错误处理里,用途、场景、目的完全不一样,分工特别明确
| 按位或
场景:设置错误、组合错误
把多个错误类型 “拼在一起”,同时开启
error_reporting(E_WARNING | E_NOTICE);//开启两个错误 2+8
//意思是要 PHP 报告:警告 或者 通知,只要出现其中一种,都给我报错
//error_reporting只接收一个参数,若要同时设置两个错误,可以使用|按位或
E_WARNING二进制为 2-0010//这里的2是对应的错误号
E_NOTICE二进制为 8-1000
//进行按位或运算
0010
| 1000
-------
1010 --10
//每个错误类型对应的数字是固定不变的,只需要记住错误名称即可
//按位或有一个为1则为1
& 按位与
场景:判断错误、检查是否包含
不能写成 E_WARNING & E_NOTICE
E_WARNING = 2 → 二进制 0010
E_NOTICE = 8 → 二进制 1000
0010
& 1000
-------
0000
error_reporting(E_WARNING & E_NOTICE);//==error_reporting(0);
//直接关闭所有错误报告
如果error_reporting()有设置过错误,里面的数字是已设置的错误总和。
$errno是当前系统报错的错误号,一次只能接收一个错误。
将error_reporting里的错误号与$errno里的错误号进行&运算
若结果不等于0,错误就在开启列表里面,反之则不在
if (!(error_reporting() & $errno)) {//判断error_reportig里是否包含$errno里的错误
//没有参数代表获取当前系统错误处理对应的级别
return false;
}