1.错误分类
- 语法错误,程序运行前都会检查语法正确性,如果错误,将不执行。比如少写了分号 “;”。
- 运行时错误,语法检查通过后,开始运行程序过程中产生的错误,比如:警告性错误 提示性错误 致命错误。
- 代码逻辑上的错误。程序可以正常运行,但计算结果却错了。
2. 错误的等级
php语言中定义了一些常量来代表一定的错误。
系统常见错误:
E_ERROR: 致命错误
E_WARNING: 警告性错误
E_NOTICE: 提示性错误
用户可自定义的错误:
E_USER_ERROR: 自定义致命错误
E_USER_WARNING: 自定义警告性错误
E_USER_NOTICE: 自定义提示性错误
其他:
E_STRICT: 严谨性语法检查错误
E_ALL 代表“所有错误”。
3.错误的触发
3.1 系统触发
程序在运行过程中,存在某种问题,系统会报告错误:
$abc;
echo $abc;//使用一个未定义的变量--E_NOTICE 提示性的错误,后续代码会继续执行
include "aabb.php";//载入一个不存在的文件 E_WARNING 警告性性的错误,后续代码会继续执行
require "aabb.php";//载入一个不存在的文件 E_WARNING ,这个有点特殊,一旦发生不再执行后面的代码
//这里这句代码没机会执行了
no_fun();//使用未定义方法-- E_ERROR,致命的错误,后续代码不再执行
3.2 自定义触发错误
开发中因为具体某种业务场景的需求,会要求数据满足一定的条件,而数据不满足此条件时,我们会主动去触发错误,表示数据不合法。
$age = 16;
if($age<18)
{
trigger_error('未成年人禁止访问',E_USER_WARNING);
}
4.错误显示
4.1 是否显示错误
有两种方式:
1. php.ini文件中 display_errors = On / Off //打开或关闭错误显示
2. ini_set(“display_errors”,”0”);//0为不显示错误报告,1显示错误报告
4.2 控制显示错误的等级
有两种方式:
1. php.ini文件配置 error_reporting
2. 代码设置
// error_reporting 设置错误报告的显示等级
ini_set('error_reporting',E_ERROR); //只显示致命性错误
ini_set('error_reporting',E_WARNING);//显示警告性错误
ini_set('error_reporting',E_NOTICE);//显示提示性错误
//显示指定的三个等级的错误报告
ini_set('error_reporting',E_ERROR | E_WARNING | E_NOTICE);
//PS:在PHP 5.3(包含)之前显示所有的错误报告应该如下写
ini_set('error_reporting',E_ALL | E_STRICT);
//5.3之后一个E_ALL搞定
ini_set('error_reporting',E_ALL );
5.错误日志
5.1 是否打开错误日志记录
php.ini中:
log_errors = On 或 Off
代码中:
ini_set(“log_erros”, “1”); //“1”打开,“0”关闭
5.2 错误日志记录文件位置
//指定错误日志文件
//指定写错误日志的文件
ini_set("error_log","../my_error_log.txt");
//syslog --会写到系统的日志
ini_set("error_log","syslog");
6.自定义错误处理
告诉系统错误你别处理了,由开发者指定的代码去处理错误。
两个步骤:
1. 定义一个错误处理函数;
2. 调用错误自定义的错误处理函数。
/**
自定义函数错误处理
$errCode -错误代码
$errMsg -错误消息
$errFile -错误文件
$errLine -错误发生行号
*/
function custom_error_handler($errCode,$errMsg,$errFile,$errLine)
{
$errStr = "";
$errStr.= "错误码:".$errCode."<br>";
$errStr.= "错误消息:".$errMsg."<br>";
$errStr.= "错误文件:".$errFile."<br>";
$errStr.= "错误发生行号:".$errLine."<br>";
$errStr.= "时间:".date("Y-m-d H:i:s")."<br>";
echo $errStr;
}
// 调用错误自定义的错误处理函数
set_error_handler("custom_error_handler");
$a;
echo $a;//使用未定义的变量