PHP错误处理及调试
-
常见错误类型
- 语法错误
- 运行错误
- 逻辑错误
- 环境错误
-
错误级别
notice
提示,报错后继续执行warning
警告,报错后继续执行error
致命错误,报错后停止执行
如何处理错误
显示错误报告
- 显示错误报告
- 修改配置文件(php.ini),实现显示错误报告
error_reporting = E_ALL
报告所有的错误display_errors = On
将错误显示在浏览器上
error_reporting()
和ini_set()
,ini配置仅脚本中生效die()
函数,自定义输出错误信息,常用于业务逻辑错误提示
- 修改配置文件(php.ini),实现显示错误报告
# error_reporting()函数 和 ini_set()函数
<?php
ini_set('display_errors', 1);
$rand_num= rand(0, 1);
echo $rand_num;
if($rand_num==0){
# 报告所有错误
error_reporting(E_ALL);
}else{
# 报告除了Notice之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);
}
echo $info;
?>
# die()函数,自定义输出错误信息
<?php
header('Content-Type: text/html;charset=utf-8');
$result= defined('PAI');
if(!$result){
die("PAI常量不存在!");
}
?>
# 通过逻辑运算符的短路特性,die()与or配合使用
<?php
$result= defined('PAI') or die("PAI常量不存在!");
?>
记录错误日志
- 记录错误日志
- 修改配置文件(php.ini),实现显示错误报告
error_reporting = E_ALL
报告所有的错误log_error=On;
将错误记录在日志中error_log=/tmp/php_errors.log
错误日志保存的地址
error_log()
函数,将错误记录到指定的日志文件中或发送电子邮件到指定地址0
默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。1
错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。3
错误发送到文件目标字符串。
- 修改配置文件(php.ini),实现显示错误报告
<?php
$a= 12;
if($a<10){
error_log("$a小于10", 0);
echo "here";
}elseif($a==10){
error_log("$a等于10", 1, "1509061327@qq.com");
}elseif($a>10){
error_log("$a大于10", 3, "G:/error.log");
}
?>
开发过程中的模式
- 开发过程中的模式
- 开发模式:错误显示在浏览器上,不要记录在日志中
- 运行模式:错误不显示在浏览器上,记录是日志中
<?php
$debug=false; //true:开发模式 false:运行模式
ini_set('error_reporting',E_ALL); //所有的错误有报告
if($debug){
ini_set('display_errors','on'); //错误显示是浏览器上
ini_set('log_errors','off'); //错误不显示在日志中
}else{
ini_set('display_errors','off');
ini_set('log_errors','on');
ini_set('error_log','./err.log'); //错误日志保存的地址
}
echo $num; //测试
?>
自定义错误处理
trigger_error
函数- 产生一个用户级别的
error/warning/notice
信息 - 用户级别的错误的常量名中一定要带有USER
- 产生一个用户级别的
<?php
$age=100;
if($age>80){
# 默认触发了notice级别的错误
trigger_error('年龄不能超过80岁');
# 触发notice级别的错误
trigger_error('年龄不能超过80岁',E_USER_NOTICE);
# 触发warning级别的错误
trigger_error('年龄不能超过80岁',E_USER_WARNING);
# 触发error级别的错误
trigger_error('年龄不能超过80岁', E_USER_ERROR);
}
?>
set_error_handler()
函数- 自定义错误处理器
<?php
function error() {
echo '这是自定义错误处理';
}
# 注册错误处理函数,只要有错误就会自动的调用错误处理函数
set_error_handler('error');
echo $num;
?>
# 带参数
<?php
/**
* 自定义错误处理函数
* @param $errno int 错误类别
* @param $errstr string 错误信息
* @param $errfile string 文件地址
* @param $errline int 错误行号
**/
function error($errno,$errstr,$errfile,$errline) {
switch($errno){
case E_NOTICE:
case E_USER_NOTICE:
echo '记录在日志中,上班后在处理<br>';
break;
case E_WARNING:
case E_USER_WARNING:
echo '给管理员发邮件<br>';
break;
case E_ERROR:
case E_USER_ERROR:
echo '给管理员打电话<br>';
break;
}
echo "错误信息:{$errstr}<br>";
echo "错误文件:{$errfile}<br>";
echo "错误行号:{$errline}<br>";
}
set_error_handler('error');
echo $num;
?>
异常处理
try catch
- 异常的处理
throw
关键字抛出异常try{} catch(){}
捕获异常
<?php
function checkNum($num){
if($num > 1){
# 抛出自定义异常
throw new Exception("Value must be 1 or below");
}
return true;
}
# 可能触发异常的代码
try{
checkNum(2);
}
# 捕获异常
catch(Exception $e){
echo 'message:'.$e-> getMessage();
}
?>
顶层异常处理器
- 顶层异常处理器
- 用于没有用
try/catch
块来捕获的异常
- 用于没有用
<?php
function ExceptionHandle($exception){
echo "<b>异常信息:</b>".$exception-> getMessage();
}
set_exception_handler("ExceptionHandle");
throw new Exception("你没有捕获的异常来了");
?>
PHP调试技术
使用输出函数进行调试
- 使用输出函数进行调试
print()
用于输出字符串echo()
用于输出一个或多个字符串print_r()
用于打印一个变量易于理解的信息,如数组var_dump()
用于打印变量的相关信息,如布尔值
使用文件记录进行调试
- 使用文件记录进行调试
file_put_contents()
可以将程序的相关信息记录到某个文件中
<?php
date_default_timezone_set("Asia/Shanghai");
$path= $_SERVER['DOCUMENT_ROOT']."/error_log.txt";
$data= 10;
if($data> 5){
# 将调试信息追加记录到文件error_log.txt中
file_put_contents($path, date("Y-m-d H:i:s", time())."数据大于5
", FILE_APPEND);
}
?>
Xdebug调试
# php.ini 中追加配置
[Xdebug]
zend_extension=D:Program Filesxamppphpextphp_xdebug.dll
xdebug.profiler_enable=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey=Visual Studio Code
xdebug.trace_output_dir="../Projects/xdebug"
xdebug.profiler_output_dir="../Projects/xdebug"
# 测试程序
<?php
textXdebug();
function textXdebug(){
requireFile();
}
function requireFile(){
require_once('abc.php');
}
?>