错误分类
- 语法错误:程序运行前都会检测语法,如果语法有问题,则不会运行,一般IDE会帮我们check了。
- 运行时错误:程序语法检测通过,在运行期间发生的错误,一般分为三种->提示性错误 警告性错误 致命错误
- 逻辑错误:程序本身可以正常执行,但输出结果和预期不符。
错误分级
php中,将各种错误进行了不同级别的划分,大约有十多个级别,这就是技术层面的错误分级。
每个级别的错误都有相应代号,就是系统内部定义的一个常量。
常见的错误级别有如下几种:
echo "<pre>";
// 系统常见错误
echo "<br> E_ERROR = " . E_ERROR . ",\t\t其对于的二进制值为:" . getBinStr(E_ERROR);
echo "<br> E_WARNING = " . E_WARNING . ",\t\t其对于的二进制值为:" . getBinStr(E_WARNING);
echo "<br> E_NOTICE = " . E_NOTICE . ",\t\t其对于的二进制值为:" . getBinStr(E_NOTICE);
echo E_NOTICE;
// 用户自定义错误
echo "<br> E_USER_ERROR = " . E_USER_ERROR . ",\t其对于的二进制值为:" . getBinStr(E_USER_ERROR);
echo "<br> E_USER_WARNING = " . E_USER_WARNING . ",\t其对于的二进制值为:" . getBinStr(E_USER_WARNING);
echo "<br> E_USER_NOTICE = " . E_USER_NOTICE . ",\t其对于的二进制值为:" . getBinStr(E_USER_NOTICE);
// 其他
echo "<br> E_STRICT = " . E_STRICT . ",\t其对于的二进制值为:" . getBinStr(E_STRICT);
echo "<br> E_ALL = " . E_ALL . ",\t\t其对于的二进制值为:" . getBinStr(E_ALL);
echo "</pre>";
function getBinStr($e)
{
$s = decbin($e);
$s1 = str_pad($s, 16, "0", STR_PAD_LEFT);
return $s1;
}
输出结果为:
E_ERROR = 1, 其对于的二进制值为:0000000000000001
E_WARNING = 2, 其对于的二进制值为:0000000000000010
E_NOTICE = 8, 其对于的二进制值为:00000000000010008
E_USER_ERROR = 256, 其对于的二进制值为:0000000100000000
E_USER_WARNING = 512, 其对于的二进制值为:0000001000000000
E_USER_NOTICE = 1024, 其对于的二进制值为:0000010000000000
E_STRICT = 2048, 其对于的二进制值为:0000100000000000
E_ALL = 32767, 其对于的二进制值为:0111111111111111
错误的触发
系统触发
程序运行中,确实出现了某种错误,此时系统就会报错。常见的有以下三种:
- E_NOTICE
提示性错误,会输出错误提示,并继续执行后面的代码
echo $a;
Notice: Undefined variable: a in D:\PhpstormProjects\study\day05\php_error_record.php on line 31
比如使用了未定义的变量。
- E_WARNING
警告性错误:会输出错误提示,并继续执行后续代码(也可能看具体情况,比如require),比如引用了不存在的文件
include ".test.php";
Warning: include(.test.php): failed to open stream: No such file or directory in D:\PhpstormProjects\study\day05\php_error_record.php on line 37
- E_ERROR
致命错误,导致程序无法执行后续语句,比如调用一个不存在的函数
unDefinedFuntion();
Fatal error: Call to undefined function unDefinedFuntion() in D:\PhpstormProjects\study\day05\php_error_record.php on line 37
自定义触发
当我们在处理某些数据时,数据本身没有问题,可能和我们当前的场景业务来说是不满足的,这时候,就需要我们自己去主动触发一个错误,来表示数据的非法性。
示例如下:
//trigger_error("错误提示内容",3种用户错误代号之一);
//如果出发了E_USER_ERROR,也会终止后面代码的执行
trigger_error("主动触发错误",E_USER_NOTICE);
( ! ) Notice: 主动触发错误 in D:\PhpstormProjects\study\day05\php_error_record.php on line 35
Call Stack
# Time Memory Function Location
1 0.0020 143856 {main}( ) ..\php_error_record.php:0
2 0.0111 144280 trigger_error ( ) ..\php_error_record.php:35
错误日志的显示问题
是否显示错误日志
- 方式一:
在php.ini文件中,修改是否显示错误日志的值,如下:
; Default Value: On// 默认
; Development Value: On//开发环境
; Production Value: Off//生产环节
; http://php.net/display-errors
display_errors = On
在此文件中修改后,需要重启才能生效。
ps:需要在apache中装载了php.ini文件,在apache的配置httpd.config中加入如下配置:
PHPIniDir “php.ini文件所在的目录”
- 方式二
直接在php脚本文件中修改,如:
ini_set("display_errors", 1);// 0 or false 关闭 1 or true 打开
使用php.ini配置,作用的是全局。
php脚本中通过ini_set()设置,作用的是当前文件
脚本中的设置优先于php.ini中的设置
自定义显示错误日志级别
前提是需要打开错误日志的输出。display_errors为1或true
- 方式一
在php.ini文件中进行修改,关键词为error_reporting
; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
; http://php.net/error-reporting
error_reporting = E_ALL
- 方式二
在php脚本中修改,如:
ini_set("error_reporting", E_ALL | E_STRICT);
ps:E_ALL | E_STRICT才是代表显示所有错误。
错误日志的记录
将错误信息保存到文件中,方便查阅
是否开启日志记录
php.ini中:log_errors = On 或 Off
php脚本中:ini_set("log_errors",1);
保存日志
- 方式一
// 提供一个文件名,系统会自动在当前目录下建对应的文件,并把错误信息写入该文件
ini_set("error_log", "my_error.txt");
- 方式二
//使用一个特殊的名字,如果发生错误,则会记录在系统的日志文件中。
//控制面板->管理工具->事件查看器->window日志->应用程序
ini_set("error_log", "syslog");
自定义错误处理器
当发生错误时,由开发者对错误进行处理,而不是交由系统处理,其实就是定义一个函数。
A. 设置要处理错误的函数名
set_error_handler("onErrorHandler");
B. 定义该函数,实现自己的错误处理
/**
* @param $errCode 错误代号
* @param $errMsg 错误信息
* @param $errFile 错误所在的文件
* @param $errLine 错误错在的行
*/
function onErrorHandler($errCode, $errMsg, $errFile, $errLine)
{
// do something
}
好了,php简单的错误处理,简记这些了~