入门 - 错误级别 ¶
作者: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_NOTICE
和E_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