PHP错误处理:try/catch及更多——完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的错误处理:try/catch及其他



错误处理是任何Web开发人员的关键任务之一。编写良好的PHP代码不仅要执行业务逻辑,还要正确应对意外情况:文件缺失、数据库问题、用户输入数据无效。在本文中,我们将详细解析PHP中的错误处理机制,从基础的try/catch开始,一直到高级技术——自定义异常和全局处理器。



1. 基础:try/catch结构



现代PHP中最常见的错误处理方式是try/catch结构。它允许"捕获"异常(Throwable类或其子类的对象)并执行替代代码,而不是让脚本异常终止。



基本语法如下:

<?phptry {    // 可能抛出异常的代码    $file = fopen('data.txt', 'r');    if (!$file) {        throw new Exception('无法打开文件');    }    // 处理文件...} catch (Exception $e) {    // 错误处理    echo '发生错误:' . $e->getMessage();}?>


在try块中放置潜在的危险代码。如果其中发生异常(通过throw或由于PHP内部错误),执行会立即跳转到catch块。变量$e包含异常对象,可以调用其方法:

  • getMessage() — 错误文本;
  • getCode() — 错误数字代码;
  • getFile() — 发生错误的文件;
  • getLine() — 引发错误的行号。


2. finally块:始终执行的代码



有时需要无论是否发生错误都执行某些操作——例如关闭数据库连接或释放资源。为此使用finally块:

<?phpfunction processData($data) {    try {        // 危险操作        if (empty($data)) {            throw new InvalidArgumentException('数据不能为空');        }        echo "正在处理数据...";        return true;    } catch (InvalidArgumentException $e) {        echo "错误:" . $e->getMessage() . "";        return false;    } finally {        echo "finally块始终执行。";    }}

processData([]); // 输出:错误:数据不能为空,然后finally块processData('test'); // 输出:正在处理数据...,然后finally块?>


即使try或catch中有return语句,finally块也会执行。这确保了资源的清理。



3. 自定义异常:扩展Exception类



在实际项目中,很少只使用标准的Exception类。更常见的是为不同类型的错误创建自定义异常类。这使代码更易读,并简化了特定情况的捕获。



示例:为验证错误和数据库错误创建异常。

<?phpclass ValidationException extends Exception {}class DatabaseException extends Exception {}

function validateUser($age) { if ($age < 0 || $age > 150) { throw new ValidationException('年龄无效'); } return true;}

function connectToDatabase($dsn) { if (empty($dsn)) { throw new DatabaseException('DSN不能为空'); } // 模拟连接...}

try { validateUser(200);} catch (ValidationException $e) { echo '验证错误:' . $e->getMessage();}

try { connectToDatabase('');} catch (DatabaseException $e) {

博客

书籍推荐