入门 - 错误级别

  • 作者:KK

  • 发表日期:2016.8.18


程序运行时会出错,出错就会报错,报的错各不相同,PHP将这些错误进行了不同级别的分类,大致有轻微的,一般的,严重的and不可原谅的

Notice级别

error_reporting(E); //先不解释这句代码,你跟着写上去才能确保会报错,如果不写,有的PHP运行环境下可能不会报错
$a = [];
echo $a[2];
echo '<br/>继续输出';

这个代码输出了一个不存在的数组下标,于是报错如下:

Notice: Undefined offset: 2 in D:\phpStudy\WWW\index.php on line 4

以上报错信息中开头的Notice:就是说这是一个Notice级别的错误(我们中文一般叫通知错误

但发生这个级别的错误时PHP不会停止运行,会继续执行后面的代码,所以两个测试代码都会显示“继续输出”这个内容


Warning级别

error_reporting(-1);
echo file_get_contents('不存在的文件');
echo '<br/>继续输出';

则报错如下:

Warning: file_get_contents(不存在的文件): failed to open stream: No such file or directory in D:\phpStudy\WWW\index.php on line 3

那很明显这个就是Warning级别的错误了,我们中文翻译一般叫警告错误,这是比Notice更加严重的错误,但也不会停止运行


Parse Error级别

$a=
echo '<br/>继续输出';

上面是一个语法错误的代码,=号右边没有值,报错如下:

Parse error: syntax error, unexpected end of file in D:\phpStudy\WWW\index.php on line 2

这个错误表示解析PHP脚本时就出错了,并且会停止运行(其实不止是停止运行,首先脚本语法都不对,叫人家怎么运行?)

好了常见错误就介绍到这里,更多错误慢慢接触了解吧


error_reporting设置报错级别

以下代码不会报错:

error_reporting(E_NOTICE);
echo file_get_contents('不存在的文件');
echo '<br/>继续输出';

但将error_reporting(E_NOTICE);改成error_reporting(E_WARNING);就会报错了

error_reporting这个函数是用来设置报错级别的,意思是说“如果发生指定级别的错误,那就报错出,如果是其它那就不用报了”

这样可以实现屏蔽一些错误,但是如果下面这样是不会报错的:

error_reporting(E_WARNING);
$a = [];
echo $a[2];
echo '<br/>继续输出';

虽然数组的下标“2”并不存在应该会报错,可是这样的错误是一个Notice级别的错误,而不是Warning,而error_reporting函数却指定了要Warning级别才报错,所以非Warning级别的错误就没报了,而下面这样再加上文件不存在的错误就会出现其中一个错误:

error_reporting(E_WARNING);
$a = [];
echo $a[2]; //这个不会报
echo file_get_contents('不存在的文件'); //这个会报错
echo '<br/>继续输出';

  • 设置多个报错级别

    如果遇到上面的问题想要2种错误一起报,那就用|运算符将E_NOTICEE_WARNING进行计算并将结果给error_reporting
    `php
    $showErrorLevels = E_NOTICE E_WARNING;
    error_reporting($showErrorLevels);
    //或者直接 error_reporting(E_NOTICE E_WARNING);
    $a = [];
    echo $a[2]; //这个不会报
    echo file_get_contents('不存在的文件'); //这个会报错
    echo '<br/>继续输出';
    `

    其实还有一招error_reporting(E_ALL);,因为PHP的错误级别不止是以上介绍的这几个级别,详见官方文档 - 预定义的错误级别常量


最后,还提醒一下,我们以后写程序时尽量不要屏蔽错误,而是将所有错误都输出来,让问题被发现去修复,不要纵容程序里的错误

所以程序应该总是执行error_reporting(E_ALL);或者error_reporting(-1);,这个-1和E_ALL是一样的,推荐用-1