PHP 异常:尝试使用 Catch 进行错误处理

作者 : 慕源网 本文共3839个字,预计阅读时间需要10分钟 发布时间: 2021-09-14 共252人阅读

PHP 异常:尝试使用 Catch 进行错误处理

在这篇文章中,您将学习如何在 PHP 中使用异常处理。从 PHP 5 开始,我们可以使用 try catch 块进行错误处理——这是处理异常和控制应用程序流程的更好方法。在本文中,我们将介绍异常处理的基础知识以及几个实际示例。

什么是异常?

PHP 5 引入了一个新的错误模型,它允许您在应用程序中抛出和捕获异常——这是一种比旧版本 PHP 更好的错误处理方式。所有异常都是基类的实例Exception,我们可以对其进行扩展以引入我们自己的自定义异常。

这里需要注意的是,异常处理不同于错误处理。在错误处理中,我们可以使用该set_error_handler函数来设置我们自定义的错误处理函数,这样每当触发错误时,它就会调用我们的自定义错误处理函数。这样,您就可以控制错误。然而,一般来说,某些类型的错误是不可恢复的并且会停止程序执行。

另一方面,异常是由代码故意抛出的,并且预计它们会在您的应用程序中的某个时刻被捕获。所以我们可以说异常是可恢复的,而不是某些不可恢复的错误。如果在应用程序中的某处捕获了抛出的异常,程序会从捕获异常的位置继续执行。应用程序中任何地方都没有捕获的异常会导致错误,从而停止程序执行。

   异常处理控制流

让我们参考下图,该图显示了通用异常处理控制流。

PHP 异常:尝试使用 Catch 进行错误处理

可以使用 PHPtrycatch块来抛出和捕获异常 。当发生意外事件时,您有责任抛出异常。让我们快速浏览一下基本的异常处理流程,如下面的伪代码所示。

// code before the try-catch block
 
try {
  // code
 
  // if something is not as expected
      // throw exception using the "throw" keyword
 
  // code, it won't be executed if the above exception is thrown
} catch (Exception $e) {
  // exception is raised and it'll be handled here
  // $e->getMessage() contains the error message
}
 
// code after the try-catch block, will always be executed

大多数情况下,当您处理异常时,您最终会使用一个模式,如上面的代码片段所示。您还可以将finally块与trycatch块一起使用,但我们将在本文稍后部分讨论这一点。

try块是在您怀疑您的代码可能会生成异常时使用的块。您应该始终使用tryand包装此类代码catch。 

   抛出异常

您调用的函数可能会抛出异常,或者您可以使用throw关键字手动抛出异常。例如,您可能会在执行任何操作之前验证某些输入,并在数据无效时抛出异常。

重要的是要注意,如果您抛出异常但尚未定义catch应该处理该异常的块,则会导致致命错误。因此,catch如果您在应用程序中抛出异常,您需要确保始终定义块。

一旦在catch块中捕获到异常,该Exception对象就会包含使用throw关键字抛出的错误消息。$e 上面例子中的变量是Exception类的一个实例,所以它可以访问该类的所有方法。在这个块中,你应该定义你自己的异常处理逻辑——你想对捕获的错误做些什么。

在下一节中,我们将通过一个真实示例来了解异常处理的工作原理。

一个真实示例

在本节中,我们将构建一个真实示例来演示 PHP 中的异常处理。

假设您已经构建了一个从config.php文件加载应用程序配置的应用程序。现在,当您的应用程序启动时,config.php文件必须存在。因此,如果config.php文件不存在,您的应用程序将无法运行。所以这是抛出异常并让用户知道他们需要解决问题的完美用例。

<?php
try {
    // init bootstrapping phase
 
    $config_file_path = "config.php";
 
    if (!file_exists($config_file_path))
    {
      throw new Exception("Configuration file not found.");
    }
  
    // continue execution of the bootstrapping phase
} catch (Exception $e) {
    echo $e->getMessage();
    die();
}
?>

正如您在上面的示例中看到的,我们在引导阶段开始时检查config.php文件是否存在。如果找到config.php文件,则继续正常执行。另一方面,如果config.php文件不存在,我们将抛出异常。另外,如果有异常,我们想停止执行!

这就是您可以在应用程序中使用异常的方式。您应该为异常的用例抛出异常——您不应该为您期望经常发生的通用错误(例如无效的用户凭据、不正确的目录权限等)抛出不必要的异常。这些可以通过常规应用程序执行流程中的通用错误消息更好地处理。

这是使用默认Exception类处理异常的示例。在下一节中,我们将看到如何扩展核心Exception类并在应用程序中创建自己的自定义异常。

如何创建自定义异常

在本节中,我们将讨论如何在应用程序中创建自定义异常。事实上,我们将扩展我们在上一节中讨论过的示例来演示自定义异常。

在前面的示例中,我们使用默认Exception类抛出了配置异常。只要您只想处理异常错误消息,这完全没问题。但是,有时您想根据抛出的异常类型做更多的事情。这就是自定义异常有用的地方。

让我们重新审视前面的示例,如以下代码段所示。

<?php
class ConfigFileNotFoundException extends Exception {}
 
try {
    // init bootstrapping phase
 
    $config_file_path = "config.php";
 
    if (!file_exists($config_file_path))
    {
      throw new ConfigFileNotFoundException("Configuration file not found.");
    }
  
    // continue execution of the bootstrapping phase
} catch (ConfigFileNotFoundException $e) {
    echo "ConfigFileNotFoundException: ".$e->getMessage();
    // other additional actions that you want to carry out for this exception
    die();
} catch (Exception $e) {
    echo $e->getMessage();
    die();
}
?>

首先,我们定义了ConfigFileNotFoundException类,它扩展了默认Exception类。现在,它变成了我们自定义的异常类,当我们想ConfigFileNotFoundException在我们的应用程序中抛出异常时,我们可以使用它。

接下来,我们使用throw关键字ConfigFileNotFoundExceptionconfig.php文件不存在时抛出异常。不过,重要的区别在于catch块。如您所见,我们定义了两个catch块,每个块用于捕获不同类型的异常。

第一个捕获该ConfigFileNotFoundException类型的异常。因此,如果抛出的异常属于该ConfigFileNotFoundException类型,则将执行此块。如果异常类型与任何特定catch块都不匹配,它将匹配最后一个,用于捕获所有通用异常消息。

最后的块

在本节中,我们将介绍如何将finally关键字与trycatch块一起使用。有时,您想执行一段代码而不管是否抛出异常。这就是您可以使用该finally块的地方,因为您放置在 finally 块中的代码将始终在执行 try 和 catch 块后执行,无论是否抛出异常。

让我们尝试使用以下示例来理解它。

try {
  // code
 
  // if something is not as expected
      // throw exception using the "throw" keyword
 
  // code, it won't be executed if the above exception is thrown
} catch (Exception $e) {
  // exception is raised and it'll be handled here
  // $e->getMessage() contains the error message
} finally {
  // code, it'll always be executed
}

上面示例中的代码几乎相同,唯一的例外是我们在finally块之后添加了catch块。而且,正如我们所讨论的,这个块中的代码将始终被执行。

finally 块的典型用例通常与资源清理有关。例如,如果您在块中打开了一个数据库连接或磁盘上的文件try,您可以执行清理任务,例如关闭finally块中的连接,因为它保证运行。

异常处理是一项关键的编码技能,您应该考虑在开发应用程序时如何处理异常。这将帮助您检测应用程序中的意外错误并从中恢复。我希望这篇文章能激励你写出更好的错误处理代码!

结论

今天,我们讨论了使用 PHP try catch 块进行异常处理的话题。在文章的前半部分,我们讨论了 PHP 中异常的基础知识,并构建了一个真实示例来演示它们的工作原理。最后,我们探讨了如何通过扩展核心Exception类来创建自定义异常。


慕源网 » PHP 异常:尝试使用 Catch 进行错误处理

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录