PHP 错误处理机制

PHP 错误处理机制

做开发离不开错误处理,搞懂 PHP 的错误机制才能写出健壮的代码。

1. 错误级别

PHP 错误分几个级别:

1)致命错误(E_ERROR)

  • 脚本停止执行
  • 比如调用不存在的类、方法

2)警告(E_WARNING)

  • 脚本继续执行
  • 比如包含不存在的文件

3)注意(E_NOTICE)

  • 不影响执行
  • 比如使用未定义的变量

2. 错误报告配置

php.ini 里的配置:

; 开发环境:显示所有错误
display_errors = On
error_reporting = E_ALL

; 生产环境:不显示错误,记录日志
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_NOTICE

3. 自定义错误处理

// 设置错误报告级别
error_reporting(E_ALL);

// 自定义错误处理函数
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    echo "错误:[$errno] $errstr 在 $errfile 第 $errline 行";
    return true; // 阻止默认错误处理
});

// 测试
echo $undefined_var;

4. 异常处理

try {
    if (!file_exists("test.txt")) {
        throw new Exception("文件不存在");
    }
    $file = fopen("test.txt", "r");
} catch (Exception $e) {
    echo "错误:" . $e->getMessage();
} finally {
    echo "\n执行完成";
}

5. 错误日志

// 记录错误日志
error_log("这是一条错误日志", 3, "/tmp/php_errors.log");

// 手动触发错误
trigger_error("自定义错误", E_USER_WARNING);

6. 开发 vs 生产

开发环境:

  • 显示错误
  • 所有错误都报告
  • 方便调试

生产环境:

  • 不显示错误(防止泄露敏感信息)
  • 记录错误日志
  • 只报告致命错误和警告

7. 常用技巧

1)错误抑制符 @

// 不推荐,会影响性能
@include("config.php");

2)die/exit

// 简单粗暴
if (! $db) {
    die("数据库连接失败");
}

3)抛异常

  • 推荐用异常处理
  • 代码更清晰,容易维护

总结

PHP 错误处理要点:

  • 开发环境显示错误,生产环境记录日志
  • 用 try-catch 处理异常
  • 错误日志要记录,方便排查
  • 不要用 @ 错误抑制符

写代码多做错误处理,线上少踩坑。


emer 发布于  2026-10-8 07:09 

PHP 错误处理最佳实践

PHP 错误处理最佳实践

错误处理是 PHP 开发最容易忽略但最重要的环节,写好了排查问题事半功倍,写不好线上出问题抓瞎。

1. 错误级别

PHP 有不同的错误级别:

  • E_ERROR:致命错误,脚本停止
  • E_WARNING:警告,脚本继续
  • E_NOTICE:注意,一般是不规范写法
  • E_PARSE:语法解析错误
// 开发环境显示所有错误
error_reporting(E_ALL);
ini_set('display_errors', 1);

// 生产环境不显示错误,只记日志
error_reporting(E_ALL);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', '/var/log/php/error.log');

2. 错误 vs 异常

PHP 里错误和异常是两回事:

  • 错误:语法错误、内存不足这种,用 try/catch 抓不住
  • 异常:业务层面的错误,比如数据库连接失败

PHP 7+ 大部分错误会抛 Error 异常,也可以抓了。

3. try/catch 用法

try {
    // 可能出错的代码
    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
} catch (PDOException $e) {
    // 捕获异常
    echo "数据库连接失败:" . $e->getMessage();
    // 记日志
    error_log("DB Error: " . $e->getMessage());
}

4. 自定义错误处理

// 设置自定义错误处理器
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    // 把错误转成异常抛出
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

// 设置异常处理器
set_exception_handler(function($e) {
    // 所有未捕获的异常都到这里
    error_log("Uncaught: " . $e->getMessage());
    echo "系统繁忙,请稍后再试";
});

// 注册关闭函数,抓致命错误
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE])) {
        error_log("Fatal: " . $error['message']);
    }
});

5. 开发 vs 生产环境

开发环境:

  • 打开 display_errors,错误直接显示在页面
  • 打开所有错误级别
  • 详细的报错信息方便调试

生产环境:

  • 关闭 display_errors,不要把错误暴露给用户
  • 错误全部写到日志文件
  • 页面显示友好的"系统错误"提示

6. 常用错误处理技巧

// 1. 用 @ 抑制错误不好,应该判断
// 不好:
$file = @file_get_contents('config.php');

// 好:
$file = file_exists('config.php') ? file_get_contents('config.php') : null;

// 2. 不要把数据库错误信息直接返回给前端
// 不好:
echo $e->getMessage();

// 好:
error_log($e->getMessage());
echo json(['code' => 500, 'msg' => '系统错误']);

// 3. 日志要分级
error_log('信息:用户登录', 3, '/var/log/info.log');
error_log('警告:登录失败次数过多', 3, '/var/log/warn.log');
error_log('错误:数据库连接失败', 3, '/var/log/error.log');

7. 总结

PHP 错误处理核心:

  • 开发环境显示错误,生产环境只记日志
  • try/catch 捕获业务异常
  • set_exception_handler 兜底
  • 不要把错误细节暴露给用户
  • 日志分级,方便排查

搞懂这些,线上出问题排查效率翻倍。


emer 发布于  2026-10-6 07:37 

PHP 错误与异常处理:从 die 到优雅的错误处理

前言

很多 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 错误信息 代码混在一起,不好维护
错误码返回 调用方需要判断错误码
异常处理 代码清晰,错误统一管理

八、最佳实践

  1. 生产环境不要显示错误:会暴露服务器信息
  2. 一定要记录日志:方便排查问题
  3. 用异常处理替代 die():代码更优雅
  4. 自定义异常类:区分不同类型的错误
  5. 兜底异常处理器:防止未捕获的异常白屏

九、日志记录

<?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 错误处理的核心思路:

  1. 开发环境显示错误,生产环境隐藏错误
  2. 用 try-catch 捕获异常,不要用 die()
  3. 自定义异常类,区分不同错误类型
  4. 设置错误处理器,把错误转成异常
  5. 一定要记录日志,方便排查问题

掌握这些,你的 PHP 代码会健壮很多。


emer 发布于  2026-10-4 10:09 
'); })();