PHP错误处理

0 阅读2分钟

错误处理指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。

错误代号

所有看到的错误代码在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();打开网页查找

1775035072587.png

或者直接输入

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;
        }