尽管您已经熟悉 PHP 错误处理,但停止脚本并不总是最佳解决方案。PHP 5 引入了管理错误的新方法,称为 PHP try catch 和 throw 方法和异常。

PHP 异常是系统可以捕获和处理的指定错误。这意味着即使检测到错误,您也可以继续执行代码。PHP 异常处理的原则与 PHP 错误处理的原理不同,因为它是面向对象的(基于创建同时包含数据和函数的对象)。

通过异常及其操作,您可以修改脚本的正常流程,以防发生特定错误。PHP try catch 函数将创建一种方法来防止代码在遇到问题时停止。

内容

PHP 尝试捕获: 主要提示

  • 在 PHP 版本 5 中引入了例外,当时标准错误处理被证明在某些情况下是不够的。

  • 用于处理异常的主要函数是 PHP try catch 和 throw。

操作异常的方法

通常,当触发异常时,系统会执行以下步骤:

  • 保存脚本的当前状态。

  • 将执行切换到预定义的函数以进行异常处理。

后续步骤取决于具体情况。处理程序可以从之前保存的脚本状态继续执行,完全终止代码流或继续从不同的代码行执行。

在本教程中,我们将演示以下使用 PHP 异常来处理错误的方法。

注意:异常专门用于 PHP 错误处理,而不是用于跳转到脚本中的另一个点。

基本用法

抛出异常后,PHP 将停止正常的脚本流并查找它遇到的第一个块,它将执行该块。如果没有这样的代码块,将发生致命错误,并显示 .catch()Uncaught Error

尝试在没有语句的情况下PHP抛出异常:catch()

例复制

<?php//creating a function, which throws an exceptionfunction check_num($number) {  if($number>1) {    throw new Exception("The value has to be 1 or lower");
  }  return true;
}//triggering the exceptioncheck_num(3);?>

您将看到显示的警告消息:
Fatal error: Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

尝试、投掷和接住

如果我们不希望我们的 Web 应用程序在每次捕获异常时崩溃,我们必须编写一个脚本来处理异常。用于处理异常的正确执行脚本应包括:

  • try块用于可能发生异常的代码部分。如果未触发异常,代码将正常运行。如果是这样,它就会被抛出。

  • throw块用于触发异常。每个都必须至少有一个块。throwcatch

  • catch- 此块检索异常并生成保存其数据的对象。

在下面的示例中,您可以查看异常的触发(我们拥有所有必要的代码块):

例复制

<?php
  //creating a function containing a potential exception
  function checkNumber($number) {    if($number > 1) {      throw new Exception('The value has to be 1 or lower');
    }    return true;
  }  //triggering the exception inside a try()
  try {
    checkNumber(2);    //In case the exception gets thrown, this is the message that is shown.
    echo 'The value is 1 or lower';
  } catch(Exception $e) {    //catching the exception
    echo 'Message: ' .$e->getMessage();
  }?>

这是我们现在得到的错误:
Message: Value must be 1 or below

有关代码示例的更多详细信息

在上面的例子中,我们抛出了一个异常,并用一个块来处理它。让我们一步一步地分解这个过程:catch()

  • 调用的函数已定义。它的工作是检查值是否大于 1。如果满足这个条件,我们PHP会抛出异常。check_num()

  • 我们刚刚创建的函数在块中被调用。try()

  • 在函数内部,会引发异常。

  • catch()接收引发的异常并创建一个名为的对象,该对象保存有关异常的信息。$e

  • 我们通过从对象调用来回显异常中的错误消息,其中包含有关异常的数据。$e->getMessage()

虽然规则规定每个异常都必须有一个 ,但有一种方法可以绕过它。为此,我们必须学习如何定义顶层异常处理程序类。catch()

自定义异常类

若要创建自定义异常处理程序,必须创建一个类,其中包含用于在触发 PHP 中处理异常的函数。此类必须是异常类的扩展。它将具有异常类的所有原始属性,但您可以为其提供自定义函数。

您可以在下面的示例中看到如何创建自定义异常类:

例复制

<?php
  class customException extends Exception {    public function error_message() {      //defining the error message
      $error_msg = 'Error caught on line '.$this->getLine().' in '.$this->getFile()
        .': <b>'.$this->getMessage().'</b> is no valid E-Mail address';      return $error_msg;
    }
  }

  $email = "someonesomeone@example...com";  try {    //checking if
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {      //throwing an exception in case email is not valid
      throw new customException($email);
    }
  } catch (customException $e) {    //displaying a custom message
    echo $e->error_message();
  }?>

这个新类是原始异常类的几乎相同的副本。但是,现在它具有自定义功能。由于它具有原始类的所有方法和属性,因此我们可以使用普通异常类中包含的每个函数,例如 、、 。error_message()GetLine()GetFile()GetMessage()

代码解释

上面的代码示例抛出一个异常,该异常是使用自定义异常类捕获的:

  • 该类是原始类的扩展,继承原始类的每个属性和方法。custom_exception()

  • 函数已创建。通过使用这个函数,我们使代码在电子邮件地址无效的情况下返回错误消息。error_message()

  • $email是一个字符串,它不是有效的电子邮件地址。

  • 执行一个块并引发异常。try()

  • 该块将显示一条错误消息。catch()

多个异常的使用

通过使用多个异常,您可以一次检查多个条件。为此,应使用多个代码块、一个开关或多个异常。请记住,这些异常中的每一个都可能使用自己的类并显示其错误消息:if..else

例复制

<?php
  class customException extends Exception {    public function error_message() {      //error message
      $error_msg = 'Error caught on line '.$this->getLine().' in '.$this->getFile()
        .': <b>'.$this->getMessage().'</b> is no valid E-Mail address';      return $error_msg;
    }
  }

  $email = "someonesomeone@example.com";  try {    //check if
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {      //throwing an exception in case email is not valid
      throw new customException($email);
    }    //checking for "example" in mail address
    if(strpos($email, "example") !== FALSE) {      throw new Exception("$email contains'example'");
    }
  }  catch (customException $e) {    echo $e->error_message();
  }  catch(Exception $e) {    echo $e->getMessage();
  }?>

有关示例的更多信息

在上面的例子中,我们看到测试了两个特定的条件。如果它们都不满足,则会引发异常:

  • 该类是原始类的扩展,继承原始类的每个属性和方法。custom_exception()

  • 函数已创建。如果电子邮件地址无效,此函数将返回错误消息。error_message()

  • $email是一个字符串,它是一个有效的电子邮件地址,包含单词 。example

  • 块执行,但不引发异常。try()

  • 在检查第二个条件时,会引发异常,因为变量包含字符串值。$emailexample

  • 该块将显示一条错误消息。catch()

如果引发的异常属于没有特定捕获的 custom_exception 类,则基本异常捕获将处理异常。

重新引发异常

有时,在引发异常时,您可能希望以不同于标准的方式处理它。您可以在块中再次抛出异常。catch()

此类脚本旨在对 Web 应用程序的用户隐藏系统错误。编码人员可能希望了解系统错误,但用户不会(也不应该)关心这一点。如果要使错误消息用户友好,则可以重新抛出异常以更改消息:

例复制

<?php
  class customException extends Exception {    public function error_message() {      //error message
      $error_msg = $this->getMessage().' is no valid E-Mail address.';      return $error_msg;
    }
  }

  $email = "someonesomeone@example.com";  try {    try {      //checking for "example" in mail address
      if(strpos($email, "example") !== FALSE) {        //throwing an exception if email is not valid
        throw new Exception($email);
      }
    } catch(Exception $e) {      //re-throwing exception
      throw new customException($email);
    }
  } catch (customException $e) {    //display custom message
    echo $e->error_message();
  }?>

示例详细信息

上面的代码示例测试输入的电子邮件地址是否将字符串作为其值。如果找到该字符串,则会重新引发异常:example

  • 该类是原始类的扩展,继承原始类的每个属性和方法。custom_exception()

  • 函数已创建。如果电子邮件地址无效,此函数将返回错误消息error_message()

  • $email是一个字符串,它是一个有效的电子邮件地址,包含单词 。example

  • 包含另一个块,用于重新抛出我们的异常。try()try()

  • 由于变量包含字符串值,因此引发异常。$emailexample

  • 捕获异常,然后抛出 a。custom_exception

  • 此异常显示用户友好的错误消息。

如果异常没有在其当前块中遇到块,它可能会在更高级别中搜索 a。catch()try()catch()

顶级异常处理程序

调用的函数创建一个用户定义的函数,旨在处理每个未捕获的异常。让我们看一下这个例子:set_exception_handler()

例复制

<?php
  function myException($exception) {    echo "<b>Exception is </b> " . $exception->getMessage();
  }

  set_exception_handler('myException');  throw new Exception('Uncaught Exception has been caught');?>

这是我们应该从上面的代码中获得的输出:
Exception: Uncaught Exception occurred

注意:在上面的代码中,没有 catch() 块。所有这些异常都由我们设置的顶级异常处理程序处理。

PHP 尝试捕获:摘要

  • 以前的 PHP 版本(PHP 5 之前)有错误,但没有例外。

  • 异常使用 和函数进行处理。try()catch()throw()

  • 可以同时使用多个异常和多个块。catch()

  • 您可以在块中编写大部分脚本来处理可能发生的所有异常。try()

  • 可以在位于块内的块中引发异常。catch()try()