PHP 异常处理


2021 年 12 月 19 日, Learn eTutorial
2447

在本 PHP 教程中,您将学习 PHP 中的所有异常处理。我们将详细讨论 try、catch、throw 和 finally 语句。

PHP 中的异常处理是什么意思?

异常是程序的一种意外结果,可以通过编程来处理。异常本质上会扰乱程序的正常流程。但是,它与错误不同之处在于异常可以处理,但错误不能由脚本控制。异常充当异常情况或错误发生的信号。异常可能由于多种原因而发生,例如数据库连接或查询失败、您尝试访问的文件不存在等等。PHP 具有强大的异常处理结构,使您能够适当地处理错误。与 PHP 的标准错误处理方法相反,异常处理是一种面向对象的问题管理技术,它允许更受控和更灵活的错误报告类型。PHP 5 版本首次提供了异常模型。

PHP : Html Form

以下术语用于处理异常

  •     try – 

    try 块包含可能导致异常或可能发生异常的代码。当脚本执行期间 try 块内发生异常时,它会在 catch 块中捕获并解决。try 块后面必须跟一个 catch 或 finally 块。一个 try 块可以后跟任意数量的 catch 块,至少有一个 catch 块。

  •     catch – 

    catch 块包含当特定类型的异常被抛出时执行的代码。它只与 try 块一起使用,从不单独使用。当异常发生时,PHP 会寻找相应的 catch 块。

  •     throw – 

    它是一个用于生成异常的关键字。记录函数抛出但未处理的所有异常也很有益。同样,try 块中的 throw 块也应该至少包含一个 catch 块。

  •    finally – 

    最后,finally 块中的代码用于清理 PHP 脚本活动。本质上,它执行程序的核心代码。

在 PHP 中使用异常处理的优点是什么?

  •    错误类型分组:

    在 PHP 中,可以抛出基本异常和对象异常。它可以构建异常对象的层次结构,将异常组织成类,并根据其类型进行分类。

  •    将错误处理和正常代码分开:

    在传统的错误处理方法中,通常使用 if-else 块来处理错误。这些条件和错误处理代码变得复杂,使其难以阅读。try-catch 块使代码更易于理解。

示例

示例 1:显示异常的基本用法

当抛出异常时,它不会执行代码后面跟着的 PHP 脚本,而是会尝试查找相应的“catch”块。如果异常未捕获,则会发出带有“未捕获异常”消息的致命错误。

让我们尝试将一个数字除以 0


<?php
try {
 $num1 = 10;
 $num2 = 0;
 if ($num2 == 0)
  throw new Exception("Can't divide by 0");
 else {
  echo $num1 / $num2;
 }
} catch (Exception $e) {
 echo 'Message: ' . $e->getMessage();
}
?>

输出


Message: Can't divide by 0

在上面的示例中,我们正在检查程序是否试图将数字除以 0。在这个程序中,我们将代码写入 try 块并检查如果除数为 0,则会抛出错误,否则它将打印除法后的结果值。

示例 2:使用多个 catch 块


<?php
class ExceptionDivideByZero extends Exception
{
}
class ExceptionDivideByNegativeNum extends Exception
{
}
function checkNum($dividend, $divisor)
{
 try {
  if ($divisor == 0) {
   throw new ExceptionDivideByZero;
  } else if ($divisor < 0) {
   throw new ExceptionDivideByNegativeNum;
  } else {
   $result = $dividend / $divisor;                echo "Result of divisi \n";
  }
 } catch (ExceptionDivideByZero $dze) {
  echo "Trying to Divide by Zero Exception! \n";
 } catch (ExceptionDivideByNegativeNum $dnne) {
  echo "Trying to Divide by Negative Number Exception \n";
 } catch (Exception $ex) {
  echo "Unknown Exception";
 }
}
checkNum(13, 7);
checkNum(40, -5);
checkNum(17, 0);
?>

输出


Result of divisi                     
Trying to Divide by Negative Number Exception 
Trying to Divide by Zero Exception!

在上面的示例中,我们正在检查程序是否试图将一个数字除以 0 和负数。在这个程序中,我们相应地创建了自定义异常。我们已经将检查脚本写入了包含 try 块的函数中。并且每个异常我们都有一个 catch 块。

如何在 PHP 中设置顶层异常处理器?

如果异常未捕获,PHP 会生成一个致命错误,并显示消息“未捕获异常...”此错误消息可能包含敏感信息,例如发生故障的文件名和行号。如果您不想向用户提供此类信息,您可以编写自己的自定义函数并使用 set_exception_handler() 方法注册它来处理任何未捕获的异常。
示例


<?php
function myException($exception)
{
 echo "Exception: " . $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

输出


Message: Can't divide by 0 Exception: Uncaught Exception occurred