1、错误分级
值 | 常量 | 描述 |
---|---|---|
1 | E_ERROR | 致命的运行时错误,脚本终止不再继续运行 |
2 | E_WARNING | 运行时警告 (非致命错误)。仅给出提示信息,但是脚本不会终止运行 |
8 | E_NOTICE | 运行时通知。表示脚本遇到可能会表现为错误的情况,但是在可以正常运行的脚本里面也可能会有类似的通知 |
256 | E_USER_ERROR | 用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的 |
512 | E_USER_WARNING | 用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的 |
1024 | E_USER_NOTICE | 用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的 |
2048 | E_STRICT | 启用 PHP 对代码的修改建议,如:使用已过时的函数时STRICT信息会提出警告 |
8191 | E_ALL | E_STRICT除外的所有错误和警告信息 |
… | … | 省略其他很多不常用的错误 |
2、错误报告配置
- 是否显示错误报告
display_errors = on/off 开启/关闭显示错误报告
开发阶段都应该显示错误报告,上线阶段则不应该直接显示错误报告到页面上
- 显示哪些级别的错误
error_reporting = E_ALL|E_STRICT 显示所有级别的错误
error_reporting = E_NOTICE 仅显示提示性E_NOTICE错误 - 错误日志记录
log_error = on/off 开启或关闭错误日志记录 - 错误日志记录路径
error_log=‘my_error.txt’ 错误日志记录的路径
对应的脚本中,可用ini_set(‘php配置项’,‘值’);用于脚本设置php.ini中某项的值
ini_get(‘php配置项’);可用于获取php.ini中某项的值
脚本中的设置优先于php.ini的设置,但只会影响当前脚本
3、自定义错误处理
- 自定义错误触发
trigger_error(“错误信息内容”,3种用户错误代号之一)
if($age>127||$age<0){
trigger_error("年龄不符合要求",E_USER_ERROR);
}
- 自定义错误处理器
set_error_handler(error_function[, error_types]):默认针对所有错误
set_exception_handler(error_function):先定义function,在定义顶层的异常处理函数
restore_exception_handler():还原成之前的异常处理程序
set_error_handler('my_error_handler');
/**
$errCode:错误代号/级别
$errMsg :错误信息内容
$errFile:错误的文件名
$errLine:错误的行号
*/
function my_error_handler($errCode,$errMsg,$errFile,$errLine){
echo "错误代号为:$errCode,错误信息为:$errMsg,错误文件为:$errFile,错误行号为:$errLine";
}
- 自定义错误处理类
class customException extends Exception //继承Exception
{
public function errorMessage()
{
//定义错误信息
$errorMsg = '错误消息的行:' . $this->getLine() . 'in' . $this->getFile() . '<b>' . $this->getMessage() . '</b>不是一个有效的邮箱地址';
return $errorMsg;
}
}
$email = 'yyfs@163.com';
try {
//检查是否符合条件
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new customException($email);
}
//检查邮箱是否是163邮箱
if (strpos($email, '163') === false) {
throw new Exception("$email 不是163邮箱");
}
} catch (customException $e) {
echo $e->errorMessage();
} catch (Exception $e) {
echo $e->getMessage();
}
- error_log($errorMsg[, $type[, $destination[, $extra_headers]]]):将错误信息发送到某个地方
参数:
$errorMsg:要记录的错误信息
$type:选择错误记录的类型
0 - 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件
1 - 错误被发送到 $destination参数中指定的邮箱地址, 第四个参数 $extra_headers 只有在这个类型里才会被用到
2 - 不再是一个选项
3 - 本地目录,错误发送到文件目标字符串
4 - 发送到 SAPI 的日志处理程序中
$destination:规定向何处发送错误消息,该参数的值依赖于 “type” 参数的值
$extra_headers只在 “type” 参数为 1 时使用。规定附加的头部,比如 From, Cc 以及 Bcc。附加头部由 CRLF (\r\n) 分隔
注意:在发送电子邮件时,必须包含 From 头部。可以在 php.ini 文件中或者通过此参数设置
//发送错误日志邮件
error_log("A custom error has been triggered", 1, "someone@example.com", "From: webmaster@example.com");
//记录到本地目录下
error_log("mysql connect failed", 3, "error.log");
4、错误捕获
- 可以捕获Execption:异常,Error:Fatal错误,TypeError:类型错误,DivisionByZeroError:0为除数,ParseError:表达式错误等异常
- 异常的函数:
Exception::getMessage:获取异常消息内容
getPrevious:返回异常链中的前一个异常
getCode:获取异常码
getFile:获取发生异常的程序文件名称
getLine:获取发生异常的代码在文件中的行号
getTrace:获取异常追踪信息
getTraceAsString:获取异常追踪信息,字符串类型
try{
$a = 20;
$division = $a / 0;
throw new Execption('你出BUG了!');
}catch(Execption $e){
echo $e->getMessage();
}catch(DivisionByZeroError $e){
echo $e->getMessage();
}finally{
//这里的代码始终都会执行
}