在软件开发中,错误处理是确保代码健壮性的重要方面。PHP 提供了强大的工具来帮助您优雅地管理意外问题。您可以使用异常来表示代码执行期间发生的意外错误。

异常可以由多种原因引起,例如:读取不存在的文件、尝试使用错误的凭据连接到数据库、除以 0 等。您可以使用 catch 块来处理异常,而不是让脚本崩溃。

Try/Catch 的构建块

  • try 块用于包含可能引发异常的代码。
  • catch 块用于处理异常。
  • finally 块(可选)用于包含始终执行的代码,无论是否抛出异常。

Try-Catch 块

Try-catch 块是 PHP 处理异常的基本方式。异常是代码执行期间发生的错误。使用 try-catch 块,您可以优雅地处理异常并向用户提供有意义的反馈。

让我们从一个简单的例子开始:

<?php
try {
    // 可能抛出异常的代码
} catch (Exception $e) {
    // 捕获特定异常
    // 您可以将其记录到系统日志或将其发送到
    // 像 Sentry 这样的第三方异常处理服务
    echo "捕获异常:" . $e->getMessage();
}

为了处理可能引发错误的代码,您可以将其包装在 try 块中,并在 catch 块中捕获和处理异常。您还可以使用关键字 throw 手动抛出任何错误。

catch块

try 语句可以有多个 catch块,每个 catch 块用于处理特定类型的错误。在多个 catch 块的情况下,异常应该从特定到通用的顺序排列。

最后一个 catch 块应该用于处理最通用的异常。这样可以确保 try...catch 语句可以捕获所有异常。

<?php
try {
    // 可能抛出异常的代码
} catch (ArgumentCountError $ex1) {
    // 处理异常 1
} catch (DivisionByZeroError $ex2) {
    // 处理异常 2
} catch (Exception $ex3) {
    // 处理异常 3
}

PHP 8 引入了联合类型,允许我们指定参数或返回值可以是多种类型之一。此功能在处理多个异常时非常有用。

<?php
try {
    // 可能抛出异常的代码
} catch (ArgumentCountError | DivisionByZeroError | Exception $ex) {
    // 处理异常
}

在本示例中,我们使用联合类型捕获 ArgumentCountErrorDivisionByZeroError 或 Exception 等异常。这使我们可以简化代码,并更容易处理不同类型的异常。

finally块

除了 try 和 catch 之外,PHP 还提供了 finally 块。finally 块中的代码无论是否抛出异常都将始终执行,因此非常适合用于清理任务。

<?php
try {
    // 可能抛出异常的代码
} catch (ArgumentCountError | DivisionByZeroError | Exception $ex) {
    // 处理异常
} finally {
    // 始终执行
}

finally 块确保无论 try 块或 catch 块中发生什么情况,您都可以释放资源、关闭连接或执行任何必要的清理操作。

没有错误处理的异常。

PHP 8.0 开始,捕获的异常的变量名称可省略,如下所示:

<?php
try {
    // 可能抛出异常的代码
} catch (Exception $ex) {
    // 处理异常
}

当您需要将代码包装在 try 块中以便它不会阻止代码执行时,这非常有用。例如,当您尝试将日志发送到外部服务但不关心是否存在错误时,或者当您需要处理遗留代码时。

注意

在处理函数中的错误异常时,您还需要注意 try/catch/finally 语句的返回类型。

<?php

function handleException(): string
{

    try {
        throw new Exception('Hello World');
    } catch (Exception $e) {
        return 'caught';

    } finally {
        return 'finally';
    }
    
    return 'Finished';
}

echo handleException(); // => finally

finally 块无论是否发生异常都会执行,即使在 catch 块中返回或重新抛出异常的情况下也不例外。

/**
 * @throws Exception
 */
function handleException(): void
{

    try {
        throw new Exception('Hello World');
    } catch (Exception $e) {
        echo 'Caught, ';

    } finally {
        echo 'Finally, ';
    }

    echo 'Finished, ';
}



echo handleException(); // => 抓住了,终于完成了。

在这种情况下,所有块都将被执行。

异常处理是 PHP 开发人员的必备技能。try-catch、联合类型和 finally 块提供了用于管理代码中的错误和异常的强大机制。通过遵循最佳实践并探索先进技术,您可以创建更可靠且可维护的 PHP 应用程序。因此,请继续学习和使用 PHP 异常处理,并记住:如果可以的话,请尽力捕获异常!