错误代号

所有看到的错误代号在PHP中都被定义成了系统常量(可以直接使用)
1)系统错误:
E_PARSE:Parse error,编译错误,代码不会执行
E_ERROR:Fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)
E_WARNING:Warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果
E_NOTICE:Notice,通知错误,不会影响代码执行
2)用户错误:
E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE
用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)
3)其他:
E_ALL,代表着所有的错误(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境)使用

<?php
    header("content-type:text/html;charset=utf-8");
    $a=0;
    if ($a==0){
        trigger_error("除数不能为0");#报错不中断代码
        trigger_error('除数不能为0',E_USER_ERROR);#报错并且中断代码
    }
    echo "hello";
?>

错误显示设置

PHP中,其实有两种方式来设置当前脚本的错误处理
1.PHP php.ini的配置文件
2.可以在运行的PHP脚本中去设置

PHP的配置文件:全局配置:php.ini文件
display_errors:是否显示错误
error_reporting:显示什么级别的错误

php.ini

2、可以在运行的PHP脚本中去设置:在脚本中定义的配置项级别比配置文件高(通常在开发当中都会在代码中去进行控制和配置)
error_reporting():设置对应的错误显示级别,没有参数表示获取当前系统错误处理对应的级别

设置举例:error_reporting(E_ERROR | E_WARNING | E_PARSE)
ini_set(‘配置文件中的配置项’,配置值)
ini_set(‘error_reporting’,E_ALL);
ini_set(‘display_errors’,1);

错误日志设置

在实际生产环境中,不会直接让错误赤裸裸的展示给用户:
1、 不友好
2、 不安全:错误会暴露网站很多信息(路径、文件名)

所以在生产环境中,一般不显示错误(错误也比较少),但是不可能避免会出现错误(测试的时候不会发现所有的问题),这个时候不希望看到,但是又希望捕捉到可以让后台程序员去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应error_log配置项
1、 开启日志功能 PHP.ini文件配置
开启php logs

2、指定路径 (指定文件不会自动生成,必须手动创建)

指定error路径

自定义错误处理

最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错

PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加操系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。

如何将用户自定义的函数放到系统中?
答:set_error_handler()

自定义错误处理函数,系统有要求

函数使用表

<?php
    header('Content-type:text/html;charset=utf-8');
    /*
     * 自定义函数
     */
    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 'fatal error in file'.$errfile.'on line'.$errline.'<br/>';
                 echo 'error info :'.$errstr;
                 break;
            case E_NOTICE:
            case E_USER_NOTICE:
                 echo 'fatal error in file'.$errfile.'on line'.$errline.'<br/>';
                 echo 'error info :'.$errstr;
                 break;
        }
        return true;
    }
    echo $a;
    set_error_handler('my_error');
    echo "<hr/>";
    echo $a;
?>

error_reporting() & $errno:如果当前的错误级别($errno)在系统系统处理的错误级别(error_reporting())中存在则处理,如果不存在则直接return出去不进行处理