PHP错误处理全面指南
PHP错误处理从简单的die()语句到自定义错误处理器,支持按级别过滤、主动触发错误及记录日志,甚至邮件通知,有效增强程序健壮性和安全性,避免用户直接看到技术细节,显著提升系统可靠性与用户体验。
在 PHP 中,默认的错误处理机制相当简单直接:一旦发生错误,浏览器就会收到一条包含文件名、行号和具体错误描述的消息。这对开发阶段或许够用,但放到生产环境中,用户看到的可能就是一堆不知所云的代码路径。

PHP 错误处理的核心方法
编写脚本和 Web 应用时,错误处理绝不是锦上添花——它是程序健壮性的基石。如果代码里缺少适当的错误检测机制,不仅显得不够专业,更会给系统安全留下可乘之机。本教程将系统梳理 PHP 中几种最实用的错误检测方法,帮你把“兜底”工作做到位。
接下来依次介绍:
- 简单的
die()语句 - 自定义错误处理器与错误触发器
- 错误报告级别及其配置
基本的错误处理:使用 die() 函数
先看一个最典型的场景:打开一个文本文件。
如果文件不存在,默认会得到类似这样的警告:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream: No such file or directory in /www/runoob/test/test.php on line 2
为了避免用户直接看到这种啰嗦的技术细节,可以在访问文件前先检查它是否存在:
现在,如果文件缺失,用户只会看到一句友好提示:
文件不存在
相比之前,这个版本显然更安全、更专业——它捕获了错误并及时终止脚本。不过,简单粗暴地终止脚本并不总是最佳选择。很多场景下,我们希望错误能被记录、被优雅地处理,而不是直接中断整个流程。这就引出了 PHP 中更高级的错误处理机制。
创建自定义错误处理器
创建一个自定义错误处理器其实很简单:只需要写一个专用的函数,当 PHP 触发错误时,这个函数就会被调用。
这个函数至少需要两个参数(错误级别和错误消息),最多可以接受五个参数(可选:文件名、行号和错误上下文)。
语法
error_function(error_level, error_message, error_file, error_line, error_context)
| 参数 | 描述 |
|---|---|
| error_level | 必需。用户定义的错误级别,必须是一个数字。具体可参考下面的错误报告级别表。 |
| error_message | 必需。用户定义的错误消息。 |
| error_file | 可选。错误发生的文件名。 |
| error_line | 可选。错误发生的行号。 |
| error_context | 可选。一个数组,包含错误发生时作用域内的所有变量及其值。 |
错误报告级别详解
下面的表格列出了 PHP 中用户自定义错误处理器可以处理的常见错误类型:
| 值 | 常量 | 描述 |
|---|---|---|
| 2 | E_WARNING | 非致命的运行时错误。脚本继续执行。 |
| 8 | E_NOTICE | 运行时通知。脚本可能发现了问题,但也可能是正常情况。 |
| 256 | E_USER_ERROR | 由用户生成的致命错误(通过 trigger_error() 触发),相当于 E_ERROR。 |
| 512 | E_USER_WARNING | 由用户生成的非致命警告,相当于 E_WARNING。 |
| 1024 | E_USER_NOTICE | 由用户生成的通知,相当于 E_NOTICE。 |
| 4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可以被自定义错误处理器处理。 |
| 8191 | E_ALL | 所有错误和警告(PHP 5.4 起,E_STRICT 也被包含在内)。 |
接下来,创建一个简单的错误处理函数:
function customError($errno, $errstr) {
echo "Error: [$errno] $errstr
";
echo "脚本结束";
die();
}
这个函数会获取错误级别和错误消息,输出它们,然后终止脚本。功能虽朴素,但已经足够作为自定义处理器的骨架。
函数创建完成后,下一步是告诉 PHP 何时调用它。
设置错误处理程序
PHP 默认的错误处理程序是内置的。现在,将上面的函数注册为全局默认的错误处理器:
set_error_handler("customError");
如果希望只针对某些特定级别的错误触发自定义函数,可以传入第二个参数来限定错误级别。不过本例中,目标是用自定义函数接管所有错误。
实例:未定义变量测试
尝试输出一个不存在的变量,来验证效果:
Error: [$errno] $errstr"; } // 设置错误处理函数 set_error_handler("customError"); // 触发错误 echo($test); ?>
输出结果:
Error: [8] Undefined variable: test
触发错误的方法
在实际开发中,当用户输入无效数据时,主动触发一个错误往往比默默吞掉异常更合理。PHP 提供了 trigger_error() 函数来完成这个任务。
实例:条件触发错误
如果变量 test 的值大于 1,则触发一个错误:
1) {
trigger_error("变量值必须小于等于 1");
}
?>
输出:
Notice: 变量值必须小于等于 1 in /www/test/runoob.php on line 5
可以指定错误的类型,通过第二个参数控制:
- E_USER_ERROR — 致命的用户生成错误,脚本将被中断。
- E_USER_WARNING — 非致命的用户生成警告,脚本继续执行。
- E_USER_NOTICE — 默认级别,运行时通知,脚本继续执行。
实例:结合自定义处理程序
当 test 大于 1 时,触发一个 E_USER_WARNING,然后由自定义处理器处理并结束脚本:
Error: [$errno] $errstr
"; echo "脚本结束"; die(); } // 设置错误处理函数,只处理 E_USER_WARNING 级别 set_error_handler("customError", E_USER_WARNING); // 触发错误 $test = 2; if ($test > 1) { trigger_error("变量值必须小于等于 1", E_USER_WARNING); } ?>
输出:
Error: [512] 变量值必须小于等于 1 脚本结束
掌握了如何创建和触发自定义错误,下一步自然就是——怎么把这些错误记录到日志里。
错误记录与日志管理
默认情况下,PHP 会按照 php.ini 中 error_log 指令的配置,把错误发往服务器的日志系统或指定文件。如果想更有针对性,可以用 error_log() 函数把错误记录到指定文件或远程地址——甚至直接发邮件通知自己。
通过 E-Mail 发送错误消息
下面这个例子演示了另一种思路:当特定错误发生时,不仅输出提示信息,还通过邮件告知网站管理员,并终止脚本:
Error: [$errno] $errstr
"; echo "已通知网站管理员"; error_log("Error: [$errno] $errstr", 1, "someone@example.com", "From: webmaster@example.com"); } // 设置错误处理函数 set_error_handler("customError", E_USER_WARNING); // 触发错误 $test = 2; if ($test > 1) { trigger_error("变量值必须小于等于 1", E_USER_WARNING); } ?>
页面输出:
Error: [512] 变量值必须小于等于 1 已通知网站管理员
同时,管理员会收到一封内容如下的邮件:
Error: [512] 变量值必须小于等于 1
注意:邮件通知适合用于关键错误,但不要滥用。常规的日志错误还是交给 PHP 默认的记录系统更稳妥,否则邮箱很快就会被塞满。
总结:PHP 错误处理最佳实践
PHP 的错误处理不止于 die()——自定义处理器、主动触发错误、按级别过滤、邮件通知……这套组合拳可以让你的代码在面对异常时更从容、更可控。从入门到实战,掌握这些方法,能让你的应用在“犯错”的时候依然保持体面。
