PHP错误处理

简介

PHP提供了错误处理和日志记录的功能. 这些函数允许你定义自己的错误处理规则,以及修改错误记录的方式. 这样,你就可以根据自己的需要,来更改和加强错误输出信息以满足实际需要。

通过日志记录功能,你可以将信息直接发送到其他日志服务器,或者发送到指定的电子邮箱(或者通过邮件网关发送),或者发送到操作系统日志等,从而可以有选择的记录和监视你的应用程序和网站的最重要的部分。

错误报告功能允许你自定义错误反馈的级别和类型,可以是简单的提示信息或者使用自定义的函数进行处理并返回信息。

错误分类

1) 语法错误
如果语法有错误,就会立即报错,并且不会去执行程序
2) 运行时错误
在程序语法检查通过后,开始运行程序,并在此过程中遇到的错误
常见3类错误: 提示性错误,警告性错误,致命错误
3) 逻辑错误
程序本身可以正常执行,没有报错。但并不是想要的结果。

错误分级

1) 技术层面的错误分级: PHP语言中,将各种错误进行了不同级别的分类归纳
每一级别的错误,都有一个“代号”,这个代号是系统内部的一个“常量”
2)系统常见错误
E_ERROR: 致命错误
E_WARNING: 警告性错误
E_NOTICE: 提示性错误
3) 用户自定义错误
E_USER_ERROR: 自定义致命错误
E_USER_WARNING: 自定义警告性错误
E_USER_NOTICE: 自定义提示性错误
4) 其他
E_STRICT: 严谨性语法检查错误
E_ALL: 代表所有错误

详细参考手册: 函数参考》影响PHP行为的扩展》错误处理和日志记录》预定义常量

错误触发

1) 方式1: 系统触发
典型错误3种:
E_NOTICE: 提示性错误: 会输出错误提示,并继续执行后续代码;如:使用不存在的变量或常量
E_WARNING: 警告性错误: 会输出错误提示,并继续执行后续代码; 如: include载入一个不存在的文件:
E_ERROR: 致命错误: 导致程序无法执行后续语句; 如:调用一个不存在的函数、调用函数时未传必传参数

2) 方式2: 自定义触发
1) 概念: 当处理某些数据时,数据本身没有错误,但根据具体应用(业务)的需要,会要求数据满足某种条件,而该数据并不满足的时候,可以在程序中“主动”去触发(创建)一个错误,以表明该数据的“非法性”。
2) 语法形式: trigger_error("错误提示信息内容",3种用户错误代号之一);
如果触发了用户的致命错误(E_USER_ERROR),会终止程序的后续执行

错误报告的显示

1) 错误报告: 显示在网页上的错误提示内容
2) 是否显示错误报告 ? display_errors
方式1:全局设置
修改配置文件php.ini的配置项 display_errors = On; //表示显示 如果是Off表示关闭
方式2: 局部设置
在php脚本文件中使用函数ini_set()来对它进行设置; 如ini_set("display_errors",0); //不显示错误报告
该方式设置要优先于全局设置
3) 显示哪些级别的错误报告? error_reporting
前提: display_errorrs=On;
方式1: 全局设置
修改配置文件php.ini 的配置项error_reporting, 如 : error_reporting = E_NOTICE | E_WARNING | E_ERROR
方式2: 局部设置
在php脚本文件中使用函数ini_set()来对它进行设置 , 如init_set("error_reporting",E_NOTICE | E_WARNING | E_ERROR)

错误日志的记录

1)是否记录错误日志? log_errors
方式1: 全局设置
修改配置文件php.ini 的配置项log_errors, 如 : log_errors= On; //记录错误日志
方式2: 局部设置
在php脚本文件中使用函数ini_set()来对它进行设置 , 如init_set("log_errors",1);//记录错误日志
获取php.ini配置项: ini_get("配置项"); //获取php.ini的指定配置项值
2)记录到哪里? error_log
可以指定位置或记录到系统日志中
指定位置文件中:直接使用文件名,系统会自动在文件夹下都建立该文件名,并用其记录该文件夹下的所有网页文件发生的错误信息。
ini_set("error_log", "myError.txt"); //如果有错误,将记录在myError.txt文件中
写入系统日志中: ini_set("error_log", "syslog");//所有错误日志记录到系统 日志文件中

自定义错误处理器

1)错误处理器: 发生错误,用来处理该错误的一种方法。实质就是一个函数
2)自定义错误处理器: 将原本有系统处理错误变为开发者自定义对错误显示和记录处理
3)分2步:
step 1: 设定用于处理错误的函数 set_error_handler("函数名"); 如:set_error_handler('myError');
step 2: 声明定义处理错误的函数。 如 function myError($errCode, $errMsg, $errFile, $errLine) { //错误处理 }

生产环境如何处理

在生产环境中,通常不在页面中直接显示错误,而是把错误信息记录到日志中。
代码示例:

<?php
ini_set('display_errors', 0); //不显示错误报告
ini_set("log_errors",1);       //记录错误日志
error_reporting(E_ALL);       //记录错误日志
ini_set("error_log", __DIR__."/myError.txt");

function hello($str) {
     return $str;
}
hello();  //调用函数时,未传必传参数,将触发致命错误

运行以上代码时,页面将不会显示错误信息,而是一个通用的500错误,具体错误信息将记录在myError.txt日志文件中。

页面显示:

错误日志:

[15-Jan-2023 09:07:13 UTC] PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function hello(), 0 passed in...

发表评论

邮箱地址不会被公开。 必填项已用*标注