如何在 PHP 中处理异常

每个程序员每天都需要处理错误和意外情况。一种方法是使用异常。除了例外,我们可以编写更健壮且不易出错的代码。可能导致异常的错误示例包括尝试打开文件系统中不存在的文件,或尝试将数字除以零。

什么是异常?

异常是在程序执行期间发生的不需要或意外的事件  它扰乱了正常的指令流,并且可能由各种错误引起。在 PHP 中,异常由类表示Exception

PHP 中的类Exception是该语言中所有异常的基类。它提供了获取异常信息的方法,例如发生异常的文件和行号,以及描述错误的消息。

当异常被抛出时,它可以被一段代码捕获,并带有适当的指令来处理它。如果未捕获到异常,它将由默认异常处理程序处理,这通常会导致致命错误并终止脚本。

基本用法

在 PHP 中处理异常的基本语法是try-catch块。该try块包含可能抛出异常的代码,该catch块包含将处理异常的代码。如果块内部抛出异常try,脚本将跳转到相应的catch块。这是一个例子:

try {
    // code that may throw an exception
    $file = fopen('nonexistent.txt', 'r');
} catch (Exception $e) {
    // code to handle the exception
    echo 'An error occurred: ' . $e->getMessage();
}

在此示例中,块内的代码try尝试打开一个不存在的文件。这会抛出一个异常,该异常会被该块捕获catch。然后 catch 块打印出一条错误消息。如果我们在这个例子中没有使用try-catch块并且抛出了异常,脚本将终止并显示错误消息。这将导致脚本无法继续执行。使用try-catch块允许脚本优雅地处理异常并在需要时继续执行。

throw 关键字

要抛出异常,我们可以使用关键字throw。关键字在块throw内部使用,try当满足特定条件时抛出异常。异常可以是类型Exception,也可以是我们创建的自定义异常类。这是一个例子:

function divide($a, $b) {
    if ($b == 0) {
        throw new Exception('Cannot divide by zero');
    }
    return $a / $b;
}

try {
    echo divide(5, 0);
} catch (Exception $e) {
    echo 'An error occurred: ' . $e->getMessage();
}

在这个例子中,该divide函数需要两个参数,$a和,并返回除以$b的结果。但是,如果第二个参数为零,则会抛出异常。$a``$b

创建自定义异常

也可以通过扩展内置类来创建自定义异常类Exception。创建自定义异常类允许我们以更有针对性和更有条理的方式处理特定类型的异常。通过扩展内置Exception类,我们可以创建自己的异常类,它继承类的所有属性和方法Exception,但也允许我们添加自己的属性和方法,这些属性和方法特定于我们试图处理的异常类型处理。这使我们能够更好地控制异常的处理方式,并使我们的代码更具可读性和可维护性。

此外,通过创建自定义异常类,我们可以捕获特定类型的异常并根据发生的特定问题进行不同的处理。要创建自定义异常类,我们可以定义一个新类并Exception像这样扩展:

class DivideByZeroException extends Exception {}

然后,稍后,我们可以将此类用作一种throw异常类型:

function divide($a, $b) {
    if ($b == 0) {
        throw new DivideByZeroException('Cannot divide by zero');
    }
    return $a / $b;
}

try {
    echo divide(5, 0);
} catch (DivideByZeroException $e) {
    echo 'An error occurred: ' . $e->getMessage();
}

customErrorMessage()这是我们如何向自定义异常类添加方法的示例:

class DivideByZeroException extends Exception {
    public function customErrorMessage() {
        $message = "Error on line " . $this->getLine() . " in file " . $this->getFile() . ": " . $this->getMessage();
        return $message;
    }
}

在这个例子中,我们添加了一个调用customErrorMessage类的方法DivideByZeroException。此方法使用类的getLine()getFile()getMessage()方法Exception来构建自定义错误消息。

我们可以像这样在块中使用这个自定义方法catch

try {
    echo divide(5, 0);
} catch (DivideByZeroException $e) {
    echo $e->customErrorMessage();
}

getLine()方法返回抛出异常的行号,该getFile()方法返回抛出异常的文件名,这使我们能够获得信息量更大的错误消息。使用这种customErrorMessage方法,输出将类似于“文件(文件名)中的行(行号)错误:不能被零除”,它会提供更详细的信息,以备我们需要调试异常时使用。

这样,我们就可以添加自定义功能,或者抛出不同类型的异常以不同的方式处理。

结论

异常是 PHP 中处理错误和意外情况的强大工具。它们允许我们将正常的代码执行流程与错误处理分开,使我们的代码更健壮,更不容易出错。throw通过以,try和关键字的形式使用异常catch,并在我们的代码中利用自定义异常的力量,我们可以使其更健壮、可读和可维护。