PHP 错误与异常处理:从 die 到优雅的错误处理
时间:2026-10-4 10:09 作者:emer 分类: 无
前言
很多 PHP 新手处理错误就是 die() 或者 exit(),页面直接白屏,用户体验极差。本文讲清楚 PHP 的错误和异常处理机制,帮你写出更健壮的代码。
一、错误 vs 异常
很多人搞不清错误和异常的区别:
- 错误:PHP 本身的问题,比如语法错误、调用不存在的函数
- 异常:程序逻辑上的问题,比如数据库连不上、文件不存在
PHP 7 以后,很多错误也变成了异常,可以用 try-catch 捕获。
二、错误级别
PHP 有很多错误级别:
E_ERROR 致命错误,脚本停止运行
E_WARNING 警告,脚本继续运行
E_NOTICE 注意,一般不影响运行
E_PARSE 语法解析错误
E_DEPRECATED 过时提醒
开发环境和生产环境的配置不一样:
# 开发环境:显示所有错误
display_errors = On
error_reporting = E_ALL
# 生产环境:不显示错误,只记录日志
display_errors = Off
log_errors = On
error_reporting = E_ALL
三、异常处理基础
try-catch-finally
<?php
try {
// 可能出错的代码
$db = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
} catch (PDOException $e) {
// 捕获异常
echo "数据库连接失败:" . $e->getMessage();
} finally {
// 不管有没有异常都会执行
echo "执行完毕";
}
抛出异常
<?php
function divide($a, $b)
{
if ($b == 0) {
throw new Exception("除数不能为 0");
}
return $a / $b;
}
try {
echo divide(10, 0);
} catch (Exception $e) {
echo "错误:" . $e->getMessage();
}
四、自定义异常类
<?php
class DbException extends Exception
{
public function errorMessage()
{
return "数据库错误:" . $this->getMessage();
}
}
class UserException extends Exception
{
public function errorMessage()
{
return "用户错误:" . $this->getMessage();
}
}
// 使用
try {
if (!$user) {
throw new UserException("用户不存在");
}
} catch (UserException $e) {
echo $e->errorMessage();
} catch (DbException $e) {
echo $e->errorMessage();
} catch (Exception $e) {
echo "其他错误:" . $e->getMessage();
}
五、错误处理器
把 PHP 错误转换成异常,统一处理:
<?php
// 自定义错误处理器
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
// 把错误转换成异常抛出
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});
try {
// 这个本来是 warning,现在会被捕获
$result = 10 / 0;
} catch (ErrorException $e) {
echo "错误:" . $e->getMessage();
}
六、异常处理器
兜底处理,最后一道防线:
<?php
// 自定义异常处理器
set_exception_handler(function ($e) {
echo "未捕获的异常:" . $e->getMessage();
// 记录日志
error_log($e->getMessage());
});
// 没有 try-catch 的异常会走这里
throw new Exception("爆炸了");
七、常见错误处理方式对比
| 方式 | 问题 |
|---|---|
die() / exit() |
页面白屏,用户体验差 |
echo 错误信息 |
代码混在一起,不好维护 |
| 错误码返回 | 调用方需要判断错误码 |
| 异常处理 | 代码清晰,错误统一管理 |
八、最佳实践
- 生产环境不要显示错误:会暴露服务器信息
- 一定要记录日志:方便排查问题
- 用异常处理替代 die():代码更优雅
- 自定义异常类:区分不同类型的错误
- 兜底异常处理器:防止未捕获的异常白屏
九、日志记录
<?php
try {
// 可能出错的代码
} catch (Exception $e) {
// 记录日志
error_log(
date('Y-m-d H:i:s') . " 错误:" . $e->getMessage() . "\n",
3,
'/var/log/php/error.log'
);
// 给用户友好提示
echo "系统繁忙,请稍后再试";
}
总结
PHP 错误处理的核心思路:
- 开发环境显示错误,生产环境隐藏错误
- 用 try-catch 捕获异常,不要用 die()
- 自定义异常类,区分不同错误类型
- 设置错误处理器,把错误转成异常
- 一定要记录日志,方便排查问题
掌握这些,你的 PHP 代码会健壮很多。