一、错误
错误类型
1. 语法错误
Deprecated 最低级别的错误(代表不推荐)
例:高版本PHP使用mysql函数 (使用mysqli或PDO替换)
Notice 通知(注意)级别的错误(并不影响程序继续执行)
例:echo $a; //直接输出一个未定义的变量
Warning 警告级别的错误
例:settype($var, 'test'); //设置一个不存在的变量类型
fatal 致命级别的错误(程序终止执行)
例:md6('test'); //调用一个未定义的函数
parse error 语法解析错误(在语法检查阶段,优先于以上所有错误,直接终止执行)
例:echo 'test' //缺少 ; 语法错误
E_USER_相关的错误 (用户产生的错误)
2. 环境错误
由于运行环境所引起的错误
3. 逻辑错误
业务逻辑产生的错误
PHP配置文件中与错误相关选项
1. error_reporting 设置错误报告的级别
2. display_errors 是否显示错误
3. log_errors 设置是否将产生错误信息记录到日志或error_log中
4. error_log 设置脚本错误将记录到的文件
5. log_errors_max_len 设置 log_errors 的最大字节数
6. ignore_repeated_errors 是否忽略重复的错误信息
7. ignore_repeated_source 是否忽略重复错误信息的来源
8. track_errors 如果开启此项,最后一个错误将永远保存在$php_errormsg中
设置错误级别
1. 修改配置文件中error_reporting选项
2. 动态设置设置错误级别(无法屏蔽语法解析错误)
error_reporting()
error_reporting('E_ALL') //显示所有错误
error_reporting('E_ALL&~E_NOTICE') //除notice级别显示所有错误
error_reporting(0) //不显示所有错误
3. 运行时设置配置选项的值
ini_set()
ini_set('error_reporting', 0); //不显示所有错误
ini_set('display_errors', 0); //不显示所有错误
@符号抑制错误输出
例: @settype($var, 'test');
通过trigger_error()触发PHP用户自定义错误
例:echo trigger_error('测试抛出一个notice错误', E_USER_NOTICE); //抛出一个通知级别的错误
echo trigger_error('测试抛出一个warning错误', E_USER_WARNING); //抛出一个警告级别的错误
错误处理
1. 记录错误日志
设置PHP配置文件
log_errors=No #开启错误日志
error_log=C:\err_logs\err.log #设置脚本错误将记录到的文件
ini_set 动态设置
ini_set('log_errors', 1) #开启错误日志
ini_set('error_log','C:\err_logs\err.log') #设置脚本错误将记录到的文件
方式1 记录到错误日志
error_log($message); //可以写入错误日志信息
方式2 记录到系统日志
ini_set('error_log','syslog');
方式3 发送邮件
error_log($message, 1, 'xxx@qq.com');
其他选项
log_errors_max_len 设置 log_errors 的最大字节数
ignore_repeated_errors 是否忽略重复的错误信息
ignore_repeated_source 是否忽略重复错误信息的来源
track_errors 如果开启此项,最后一个错误将永远保存在$php_errormsg中
自定义错误处理器
set_error_handler() 此方法不返还false则默认绕过php内置错误处理
例:
header('content-type:text/html;charset=utf-8');
error_reporting(-1);
function customError($errno, $errmsg, $file, $line) {
echo "<b>错误代码: </b>[{$errno}] {$message}<br/>".PHP_EOL;
echo "<b>错误行号: </b>[{$file}] 文件中第 {$line} 行<br/>".PHP_EOL;
echo "<b>PHP版本: </b>".PHP_VERSION."<br/>".PHP_EOL;
echo "<b>系统: </b>".PHP_OS."<br/>".PHP_EOL;
die();
}
set_error_handler('customError', E_ALL);
echo $test; //测试 输出一个未定义变量错误
trigger_error('this is a test of error', E_USER_ERROR); //抛出用户设置致命错误
echo "<br/>";
echo 'continue...';
restore_error_handler();//取消错误接管
二、异常
try{
代码段;
throw new Exception() 抛出异常
}catch(Exception $e){ 捕获异常
$e->getMessage();
try{
throw new Exception() 继续抛出异常
}catch(Exception $e){
$e->getMessage();
}
}
自定义异常类
1.需要继承基类 Exception
2.只能重写 构造函数和to_string函数
class MyException extends Exception {
public function __construct($msg) {
parent::__construct($msg);
}
public function __toString() {
echo "this is a test";
}
}
try{
throw new MyException('test');
}catch(MyException $e) {
echo $e;
}catch(Exception $e) { //一般将基类放到最后
echo $e->getMessage();
}
自定义异常处理器
set_exception_handle($function)
set_exception_handle(类名,静态方法)
restore_exception_handler() 恢复上一次定义的处理器