PHP try-catch语句

PHP try-catch语句

PHP的try和catch是具有异常处理功能的代码块,它们包含处理异常的代码。它们在异常处理中起着重要的作用。在try-catch块中还有一个重要的关键字是 throw . throw是用来抛出异常的关键字。

每个try块必须至少有一个catch块。另一方面,一个try块也可以有多个catch块来处理不同类别的异常。

语法

在异常处理中使用以下语法来处理运行时错误 –

<?php
            //try block
    try {
        //code that can throw exception
    } 
            //catch block
catch (Exception $e) {
        //code to print exception caught in the block
    }
    //finally block
    finally {
        //any code that will always execute 
}
?>

让我们更详细地学习try-throw-catch:

try

try块包含可能包含异常的代码。运行时在try块中引发的异常会被catch块捕获。因此,每个try块必须至少有一个catch块。它包含可能发生异常的代码块。

关于try需要注意以下几点:

  • try块必须跟随一个catch块或finally块。
  • 一个try块必须有至少一个catch块。
  • 一个try块可以有多个catch块。

catch

catch块捕获在try块中引发的异常。它包含用于捕获异常的代码,在try块中通过throw关键字抛出异常。当抛出特定异常时,catch块会执行。PHP会寻找匹配的catch块并将异常对象赋给一个变量。

关于catch需要注意以下几点:

  • 一个try可以有多个catch块。
  • 抛出的异常会被一个或多个catch块捕获和处理。
  • catch块总是与try块一起使用,不能单独使用。
  • 它紧跟在try块之后。

throw

throw是一个关键字,用于抛出异常。需要注意的是,至少有一个“catch块”来捕获异常。

它列出了由函数抛出的无法由函数本身处理的异常。

finally

finally是一个包含程序执行所必需的关键代码的块。finally块也用于PHP中的清理活动。它类似于catch块,用于处理异常。唯一的区别是,无论是否处理异常,它总是执行。

finally块可以在catch块之后或替代catch块之处指定。它总是在try和catch块后执行,无论是否抛出异常,并在正常执行重新开始之前执行。它在以下场景中很有用-关闭数据库连接、流等。

示例1

让我们举一个示例来解释抛出和尝试捕获的常见流程以及finally块:

<?php
//user-defined function with an exception
function checkNumber(num) {
   if(num>=1) {
     //throw an exception
     throw new Exception("Value must be less than 1");
   }
   return true;
}

//trigger an exception in a "try" block
try {
   checkNumber(5);
   //If the exception throws, below text will not be display
   echo 'If you see this text, the passed value is less than 1';
}

//catch exception
catch (Exception e) {
   echo 'Exception Message: ' .e->getMessage();
}
finally {
   echo '</br> It is finally block, which always executes.';
}
?>

输出:

Exception Message: Value must be less than 1
It is finally block, which always executes.

示例2

<?php

//user-defined function with an exception
function testEven(num) {
    //trigger an exception in a "try" block
    try {
         if(num%2 == 1) {
           //throw an exception
           throw new Exception("Passed number is an ODD Number");
           echo "After throw this statement will not execute";
          }
          echo '</br> <b> If you see this text, the passed value is an EVEN Number </b>';
     }
     //catch exception
     catch (Exception e) {
         echo '</br> <b> Exception Message: ' .e->getMessage() .'</b>';
     }
     finally {
        echo '</br> It is finally block, which always executes.';
     }
}
      echo 'Output for ODD Number';
      testEven(19);

      echo '</br> </br>';
      echo 'Output for EVEN Number';
     testEven(12);

?>

输出:

在下面的输出中,您可以看到当传入一个奇数时,会显示一个异常消息。另一方面,当传入一个偶数时,会显示另一条消息。

Output for ODD Number 
Exception Message: Passed number is an ODD Number
It is finally block, which always executes.

Output for EVEN Number
If you see this text, the passed value is an EVEN Number
It is finally block, which always executes.

示例3:自定义异常和多个catch语句

在下面的示例中,我们将创建一个自定义的异常类,该类继承自Exception类。在这里,我们还将使用一个try语句块和多个catch语句块。

<?php
class OddNumberException extends Exception { }
//user-defined function with an exception
function testEven(num) {
    //trigger an exception in a "try" block
    try {
         if(num%2 == 1) {
           //throw an exception
           throw new OddNumberException;
           echo "After throw this statement will not execute";
          }
          echo '</br> <b> If you see this text, the passed value is an EVEN Number </b>';
     }

     //catch exception
     catch (OddNumberException ex) {
         echo '</br> <b> Exception Message: ODD Number' .'</b>';
     }
     //catch exception
     catch (Exceptione) {
         echo '</br> <b> Exception Message: ' .$e->getMessage() .'</b>';
     }

}
   echo 'Output for EVEN Number';
   testEven(28);
   echo '</br> </br>';
   echo 'Output for ODD Number';
   testEven(17);
?>

输出:

Output for EVEN Number
If you see this text, the passed value is an EVEN Number 

Output for ODD Number 
Exception Message: ODD Number

重要要点:

  • 除了PHP异常类及其子类之外,我们还可以创建自定义异常类来处理无法捕获的异常。
  • 在PHP 5.5及以上版本中,finally块用于处理异常。无论是否抛出异常,该块总是会被执行。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程